< Module exactEval:condExpr.
< Prove_Constraint exactEval:host:proj_expr_unique. Variables: L1 L2 E2 X F T C PrA : L1 |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) PrB : L2 |{expr}- condExpr C T F ~~> E2 IsE : is_expr (condExpr C T F) 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 "X" L1 X ============================ stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) = E2
< PrB: case PrB. Variables: L1 L2 X F T C X1 PrA : L1 |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsE : is_expr (condExpr C T F) 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 "X" L1 X PrB : fresh_name "X" L2 X1 ============================ stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) = stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1)
< apply fresh_name_unique_mems to PrA1 PrB _ _. Variables: L1 L2 F T C X1 PrA : L1 |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsE : is_expr (condExpr C T F) 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 "X" L1 X1 PrB : fresh_name "X" L2 X1 ============================ stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) = stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1)
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_expr_is. Variables: L X F T C Pr : L |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsE : is_expr (condExpr C T F) IsL : is_list is_string L Pr1 : fresh_name "X" L X ============================ is_expr (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X))
< case IsE. Variables: L X F T C Pr : L |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsL : is_list is_string L Pr1 : fresh_name "X" L X H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_expr (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X))
< apply fresh_name_is to _ Pr1. Variables: L X F T C Pr : L |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsL : is_list is_string L Pr1 : fresh_name "X" L X H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_string X ============================ is_expr (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X))
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_expr_other. Variables: L L' X F T C Pr : L |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsE : is_expr (condExpr C T F) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "X" L X ============================ exists E'', L' |{expr}- condExpr C T F ~~> E''
< apply fresh_name_exists to _ IsL' with Base = "X". Variables: L L' X F T C F1 Pr : L |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsE : is_expr (condExpr C T F) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "X" L X H1 : fresh_name "X" L' F1 ============================ exists E'', L' |{expr}- condExpr C T F ~~> E''
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_is. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_other. 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. Proof completed.
< Prove_Constraint exactEval:host:proj_typ_is. 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: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ R1 : is_expr Expr2 * R2 : is_expr Expr1 * R3 : is_expr Expr * ============================ <is_expr {P}> (condExpr Expr2 Expr1 Expr)
< apply IH to R1. Subgoal 1.21: Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ R1 : is_expr Expr2 * R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr2 ============================ <is_expr {P}> (condExpr Expr2 Expr1 Expr)
< apply IH to R2. Subgoal 1.21: Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ R1 : is_expr Expr2 * R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr2 H2 : <is_expr {P}> Expr1 ============================ <is_expr {P}> (condExpr Expr2 Expr1 Expr)
< apply IH to R3. Subgoal 1.21: Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ R1 : is_expr Expr2 * R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr2 H2 : <is_expr {P}> Expr1 H3 : <is_expr {P}> Expr ============================ <is_expr {P}> (condExpr Expr2 Expr1 Expr)
< unfold . Subgoal 1.21: Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ R1 : is_expr Expr2 * R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr2 H2 : <is_expr {P}> Expr1 H3 : <is_expr {P}> Expr ============================ exists A1 X_T, (<is_expr {P}> Expr2 /\ (<is_expr {P}> Expr1 /\ <is_expr {P}> Expr)) /\ (A1 |{expr}- condExpr Expr2 Expr1 Expr ~~> X_T /\ <is_expr {P}> X_T)
< F: assert fresh_name "X" [] "X". Subgoal 1.21: Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ R1 : is_expr Expr2 * R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr2 H2 : <is_expr {P}> Expr1 H3 : <is_expr {P}> Expr F : fresh_name "X" [] "X" ============================ exists A1 X_T, (<is_expr {P}> Expr2 /\ (<is_expr {P}> Expr1 /\ <is_expr {P}> Expr)) /\ (A1 |{expr}- condExpr Expr2 Expr1 Expr ~~> X_T /\ <is_expr {P}> X_T)
< apply fresh_name_is to _ F. Subgoal 1.21: Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ R1 : is_expr Expr2 * R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr2 H2 : <is_expr {P}> Expr1 H3 : <is_expr {P}> Expr F : fresh_name "X" [] "X" H4 : is_string "X" ============================ exists A1 X_T, (<is_expr {P}> Expr2 /\ (<is_expr {P}> Expr1 /\ <is_expr {P}> Expr)) /\ (A1 |{expr}- condExpr Expr2 Expr1 Expr ~~> X_T /\ <is_expr {P}> X_T)
< exists [], stmtExpr (seq (declare intTy "X" (num 0)) (ifThenElse Expr2 (assign "X" Expr1) (assign "X" Expr))) (name "X"). Subgoal 1.21: Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ R1 : is_expr Expr2 * R2 : is_expr Expr1 * R3 : is_expr Expr * H1 : <is_expr {P}> Expr2 H2 : <is_expr {P}> Expr1 H3 : <is_expr {P}> Expr F : fresh_name "X" [] "X" H4 : is_string "X" ============================ (<is_expr {P}> Expr2 /\ (<is_expr {P}> Expr1 /\ <is_expr {P}> Expr)) /\ ([] |{expr}- condExpr Expr2 Expr1 Expr ~~> stmtExpr (seq (declare intTy "X" (num 0)) (ifThenElse Expr2 (assign "X" Expr1) (assign "X" Expr))) (name "X") /\ <is_expr {P}> (stmtExpr (seq (declare intTy "X" (num 0)) (ifThenElse Expr2 (assign "X" Expr1) (assign "X" Expr))) (name "X")))
< search. 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: V1 V2 V3 V4 V5 V6 F T C 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 (condExpr C T F) VarsA : vars (condExpr C T F) V1 @ VarsB : vars (condExpr C T F) V2 VarsA1 : vars C V3 * VarsA2 : vars T V4 * VarsA3 : vars F V5 * VarsA4 : V3 ++ V4 = V6 VarsA5 : V6 ++ V5 = V1 ============================ V1 = V2
< case IsE. Subgoal 1.21: Variables: V1 V2 V3 V4 V5 V6 F T C 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 (condExpr C T F) V1 @ VarsB : vars (condExpr C T F) V2 VarsA1 : vars C V3 * VarsA2 : vars T V4 * VarsA3 : vars F V5 * VarsA4 : V3 ++ V4 = V6 VarsA5 : V6 ++ V5 = V1 H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ V1 = V2
< VarsB: case VarsB. Subgoal 1.21: Variables: V1 V2 V3 V4 V5 V6 F T C V7 V8 V9 V10 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 (condExpr C T F) V1 @ VarsA1 : vars C V3 * VarsA2 : vars T V4 * VarsA3 : vars F V5 * VarsA4 : V3 ++ V4 = V6 VarsA5 : V6 ++ V5 = V1 H1 : is_expr C H2 : is_expr T H3 : is_expr F VarsB : vars C V7 VarsB1 : vars T V8 VarsB2 : vars F V9 VarsB3 : V7 ++ V8 = V10 VarsB4 : V10 ++ V9 = V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB. Subgoal 1.21: Variables: V1 V2 V4 V5 V6 F T C V7 V8 V9 V10 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 (condExpr C T F) V1 @ VarsA1 : vars C V7 * VarsA2 : vars T V4 * VarsA3 : vars F V5 * VarsA4 : V7 ++ V4 = V6 VarsA5 : V6 ++ V5 = V1 H1 : is_expr C H2 : is_expr T H3 : is_expr F VarsB : vars C V7 VarsB1 : vars T V8 VarsB2 : vars F V9 VarsB3 : V7 ++ V8 = V10 VarsB4 : V10 ++ V9 = V2 ============================ V1 = V2
< apply IH to _ VarsA2 VarsB1. Subgoal 1.21: Variables: V1 V2 V5 V6 F T C V7 V8 V9 V10 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 (condExpr C T F) V1 @ VarsA1 : vars C V7 * VarsA2 : vars T V8 * VarsA3 : vars F V5 * VarsA4 : V7 ++ V8 = V6 VarsA5 : V6 ++ V5 = V1 H1 : is_expr C H2 : is_expr T H3 : is_expr F VarsB : vars C V7 VarsB1 : vars T V8 VarsB2 : vars F V9 VarsB3 : V7 ++ V8 = V10 VarsB4 : V10 ++ V9 = V2 ============================ V1 = V2
< apply IH to _ VarsA3 VarsB2. Subgoal 1.21: Variables: V1 V2 V6 F T C V7 V8 V9 V10 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 (condExpr C T F) V1 @ VarsA1 : vars C V7 * VarsA2 : vars T V8 * VarsA3 : vars F V9 * VarsA4 : V7 ++ V8 = V6 VarsA5 : V6 ++ V9 = V1 H1 : is_expr C H2 : is_expr T H3 : is_expr F VarsB : vars C V7 VarsB1 : vars T V8 VarsB2 : vars F V9 VarsB3 : V7 ++ V8 = V10 VarsB4 : V10 ++ V9 = V2 ============================ V1 = V2
< apply append_unique to VarsA4 VarsB3. Subgoal 1.21: Variables: V1 V2 F T C V7 V8 V9 V10 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 (condExpr C T F) V1 @ VarsA1 : vars C V7 * VarsA2 : vars T V8 * VarsA3 : vars F V9 * VarsA4 : V7 ++ V8 = V10 VarsA5 : V10 ++ V9 = V1 H1 : is_expr C H2 : is_expr T H3 : is_expr F VarsB : vars C V7 VarsB1 : vars T V8 VarsB2 : vars F V9 VarsB3 : V7 ++ V8 = V10 VarsB4 : V10 ++ V9 = V2 ============================ V1 = V2
< apply append_unique to VarsA5 VarsB4. Subgoal 1.21: Variables: V2 F T C V7 V8 V9 V10 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 (condExpr C T F) V2 @ VarsA1 : vars C V7 * VarsA2 : vars T V8 * VarsA3 : vars F V9 * VarsA4 : V7 ++ V8 = V10 VarsA5 : V10 ++ V9 = V2 H1 : is_expr C H2 : is_expr T H3 : is_expr F VarsB : vars C V7 VarsB1 : vars T V8 VarsB2 : vars F V9 VarsB3 : V7 ++ V8 = V10 VarsB4 : V10 ++ V9 = V2 ============================ V2 = V2
< search. Proof completed.
< Prove exactEval:host:vars_is. Subgoal 1.21: Variables: V V2 V3 V4 V5 F T C 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 (condExpr C T F) V : vars (condExpr C T F) V @ V1 : vars C V2 * V2 : vars T V3 * V3 : vars F V4 * V4 : V2 ++ V3 = V5 V5 : V5 ++ V4 = V ============================ is_list is_string V
< case IsE. Subgoal 1.21: Variables: V V2 V3 V4 V5 F T C 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 (condExpr C T F) V @ V1 : vars C V2 * V2 : vars T V3 * V3 : vars F V4 * V4 : V2 ++ V3 = V5 V5 : V5 ++ V4 = V H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.21: Variables: V V2 V3 V4 V5 F T C 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 (condExpr C T F) V @ V1 : vars C V2 * V2 : vars T V3 * V3 : vars F V4 * V4 : V2 ++ V3 = V5 V5 : V5 ++ V4 = V H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string V2 ============================ is_list is_string V
< apply IH to _ V2. Subgoal 1.21: Variables: V V2 V3 V4 V5 F T C 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 (condExpr C T F) V @ V1 : vars C V2 * V2 : vars T V3 * V3 : vars F V4 * V4 : V2 ++ V3 = V5 V5 : V5 ++ V4 = V H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string V2 H5 : is_list is_string V3 ============================ is_list is_string V
< apply IH to _ V3. Subgoal 1.21: Variables: V V2 V3 V4 V5 F T C 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 (condExpr C T F) V @ V1 : vars C V2 * V2 : vars T V3 * V3 : vars F V4 * V4 : V2 ++ V3 = V5 V5 : V5 ++ V4 = V H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string V2 H5 : is_list is_string V3 H6 : is_list is_string V4 ============================ is_list is_string V
< apply append_list_string_is to _ _ V4. Subgoal 1.21: Variables: V V2 V3 V4 V5 F T C 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 (condExpr C T F) V @ V1 : vars C V2 * V2 : vars T V3 * V3 : vars F V4 * V4 : V2 ++ V3 = V5 V5 : V5 ++ V4 = V H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string V2 H5 : is_list is_string V3 H6 : is_list is_string V4 H7 : is_list is_string V5 ============================ is_list is_string V
< apply append_list_string_is to _ _ V5. Subgoal 1.21: Variables: V V2 V3 V4 V5 F T C 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 (condExpr C T F) V @ V1 : vars C V2 * V2 : vars T V3 * V3 : vars F V4 * V4 : V2 ++ V3 = V5 V5 : V5 ++ V4 = V H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string V2 H5 : is_list is_string V3 H6 : is_list is_string V4 H7 : is_list is_string V5 H8 : 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: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< VC: apply IH to IsE1. Subgoal 1.21: Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * VC : vars Expr2 V ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< VT: apply IH to IsE2. Subgoal 1.21: Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * VC : vars Expr2 V VT : vars Expr1 V1 ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< VF: apply IH to IsE3. Subgoal 1.21: Variables: Expr Expr1 Expr2 V V1 V2 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * VC : vars Expr2 V VT : vars Expr1 V1 VF : vars Expr V2 ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< IsVC: apply vars_is to _ VC. Subgoal 1.21: Variables: Expr Expr1 Expr2 V V1 V2 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * VC : vars Expr2 V VT : vars Expr1 V1 VF : vars Expr V2 IsVC : is_list is_string V ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< IsVT: apply vars_is to _ VT. Subgoal 1.21: Variables: Expr Expr1 Expr2 V V1 V2 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * VC : vars Expr2 V VT : vars Expr1 V1 VF : vars Expr V2 IsVC : is_list is_string V IsVT : is_list is_string V1 ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< IsVF: apply vars_is to _ VF. Subgoal 1.21: Variables: Expr Expr1 Expr2 V V1 V2 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * VC : vars Expr2 V VT : vars Expr1 V1 VF : vars Expr V2 IsVC : is_list is_string V IsVT : is_list is_string V1 IsVF : is_list is_string V2 ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< App: apply append_list_string_total to IsVC IsVT. Subgoal 1.21: Variables: Expr Expr1 Expr2 V V1 V2 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * VC : vars Expr2 V VT : vars Expr1 V1 VF : vars Expr V2 IsVC : is_list is_string V IsVT : is_list is_string V1 IsVF : is_list is_string V2 App : V ++ V1 = L3 ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< IsL3: apply append_list_string_is to _ _ App. Subgoal 1.21: Variables: Expr Expr1 Expr2 V V1 V2 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * VC : vars Expr2 V VT : vars Expr1 V1 VF : vars Expr V2 IsVC : is_list is_string V IsVT : is_list is_string V1 IsVF : is_list is_string V2 App : V ++ V1 = L3 IsL3 : is_list is_string L3 ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< apply append_list_string_total to IsL3 IsVF. Subgoal 1.21: Variables: Expr Expr1 Expr2 V V1 V2 L3 L1 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 (condExpr Expr2 Expr1 Expr) @ IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * VC : vars Expr2 V VT : vars Expr1 V1 VF : vars Expr V2 IsVC : is_list is_string V IsVT : is_list is_string V1 IsVF : is_list is_string V2 App : V ++ V1 = L3 IsL3 : is_list is_string L3 H1 : L3 ++ V2 = L1 ============================ exists V, vars (condExpr Expr2 Expr1 Expr) V
< search. Proof completed.
< Prove exactEval:host:stmtNames_is, exactEval:host:stmtNames_isCtx, exactEval:host:exprNames_is. Subgoal 3.22: Variables: Ctx N CN TN FN N2 F T C 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 (condExpr C T F) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (condExpr C T F) N @ EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N ============================ is_list is_string N
< case IsE. Subgoal 3.22: Variables: Ctx N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.22: Variables: Ctx N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string CN ============================ is_list is_string N
< apply IH_E to _ _ EN2. Subgoal 3.22: Variables: Ctx N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string CN H5 : is_list is_string TN ============================ is_list is_string N
< apply IH_E to _ _ EN3. Subgoal 3.22: Variables: Ctx N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string CN H5 : is_list is_string TN H6 : is_list is_string FN ============================ is_list is_string N
< apply append_list_string_is to _ _ EN4. Subgoal 3.22: Variables: Ctx N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string CN H5 : is_list is_string TN H6 : is_list is_string FN H7 : is_list is_string N2 ============================ is_list is_string N
< apply append_list_string_is to _ _ EN5. Subgoal 3.22: Variables: Ctx N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list is_string CN H5 : is_list is_string TN H6 : is_list is_string FN H7 : is_list is_string N2 H8 : is_list is_string N ============================ is_list is_string N
< search. Proof completed.
< Prove exactEval:host:stmtNames_unique, exactEval:host:exprNames_unique. Subgoal 2.22: Variables: Ctx NA NB CN TN FN N1 F T C 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 (condExpr C T F) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (condExpr C T F) NA @ ENB : exprNames Ctx (condExpr C T F) NB ENA1 : exprNames Ctx C CN * ENA2 : exprNames Ctx T TN * ENA3 : exprNames Ctx F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA ============================ NA = NB
< case IsE. Subgoal 2.22: Variables: Ctx NA NB CN TN FN N1 F T C 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 (condExpr C T F) NA @ ENB : exprNames Ctx (condExpr C T F) NB ENA1 : exprNames Ctx C CN * ENA2 : exprNames Ctx T TN * ENA3 : exprNames Ctx F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ NA = NB
< ENB: case ENB. Subgoal 2.22: Variables: Ctx NA NB CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ ENA1 : exprNames Ctx C CN * ENA2 : exprNames Ctx T TN * ENA3 : exprNames Ctx F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames Ctx C CN1 ENB1 : exprNames Ctx T TN1 ENB2 : exprNames Ctx F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.22: Variables: Ctx NA NB TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ ENA1 : exprNames Ctx C CN1 * ENA2 : exprNames Ctx T TN * ENA3 : exprNames Ctx F FN * ENA4 : CN1 ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames Ctx C CN1 ENB1 : exprNames Ctx T TN1 ENB2 : exprNames Ctx F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB ============================ NA = NB
< apply IH_E to _ _ ENA2 ENB1. Subgoal 2.22: Variables: Ctx NA NB FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ ENA1 : exprNames Ctx C CN1 * ENA2 : exprNames Ctx T TN1 * ENA3 : exprNames Ctx F FN * ENA4 : CN1 ++ TN1 = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames Ctx C CN1 ENB1 : exprNames Ctx T TN1 ENB2 : exprNames Ctx F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB ============================ NA = NB
< apply IH_E to _ _ ENA3 ENB2. Subgoal 2.22: Variables: Ctx NA NB N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ ENA1 : exprNames Ctx C CN1 * ENA2 : exprNames Ctx T TN1 * ENA3 : exprNames Ctx F FN1 * ENA4 : CN1 ++ TN1 = N1 ENA5 : N1 ++ FN1 = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames Ctx C CN1 ENB1 : exprNames Ctx T TN1 ENB2 : exprNames Ctx F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB ============================ NA = NB
< apply append_unique to ENA4 ENB3. Subgoal 2.22: Variables: Ctx NA NB F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ ENA1 : exprNames Ctx C CN1 * ENA2 : exprNames Ctx T TN1 * ENA3 : exprNames Ctx F FN1 * ENA4 : CN1 ++ TN1 = N2 ENA5 : N2 ++ FN1 = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames Ctx C CN1 ENB1 : exprNames Ctx T TN1 ENB2 : exprNames Ctx F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB ============================ NA = NB
< apply append_unique to ENA5 ENB4. Subgoal 2.22: Variables: Ctx NB F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NB @ ENA1 : exprNames Ctx C CN1 * ENA2 : exprNames Ctx T TN1 * ENA3 : exprNames Ctx F FN1 * ENA4 : CN1 ++ TN1 = N2 ENA5 : N2 ++ FN1 = NB H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames Ctx C CN1 ENB1 : exprNames Ctx T TN1 ENB2 : exprNames Ctx F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB ============================ NB = NB
< search. Proof completed.
< Prove exactEval:host:stmtNames_keep_older. Proof completed.
< Prove exactEval:host:stmtNames_exists, exactEval:host:exprNames_exists, exactEval:host:argsNames_exists, exactEval:host:recFieldNames_exists. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< ENC: apply IH_E to IsE1 _. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ENC : exprNames Ctx Expr2 N ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< ENT: apply IH_E to IsE2 _. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ENC : exprNames Ctx Expr2 N ENT : exprNames Ctx Expr1 N1 ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< ENF: apply IH_E to IsE3 _. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 N N1 N2 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ENC : exprNames Ctx Expr2 N ENT : exprNames Ctx Expr1 N1 ENF : exprNames Ctx Expr N2 ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< IsC: apply exprNames_is to _ _ ENC. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 N N1 N2 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ENC : exprNames Ctx Expr2 N ENT : exprNames Ctx Expr1 N1 ENF : exprNames Ctx Expr N2 IsC : is_list is_string N ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< IsT: apply exprNames_is to _ _ ENT. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 N N1 N2 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ENC : exprNames Ctx Expr2 N ENT : exprNames Ctx Expr1 N1 ENF : exprNames Ctx Expr N2 IsC : is_list is_string N IsT : is_list is_string N1 ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< IsF: apply exprNames_is to _ _ ENF. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 N N1 N2 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ENC : exprNames Ctx Expr2 N ENT : exprNames Ctx Expr1 N1 ENF : exprNames Ctx Expr N2 IsC : is_list is_string N IsT : is_list is_string N1 IsF : is_list is_string N2 ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< App: apply append_list_string_total to IsC IsT. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 N N1 N2 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ENC : exprNames Ctx Expr2 N ENT : exprNames Ctx Expr1 N1 ENF : exprNames Ctx Expr N2 IsC : is_list is_string N IsT : is_list is_string N1 IsF : is_list is_string N2 App : N ++ N1 = L3 ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< IsL3: apply append_list_string_is to _ _ App. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 N N1 N2 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ENC : exprNames Ctx Expr2 N ENT : exprNames Ctx Expr1 N1 ENF : exprNames Ctx Expr N2 IsC : is_list is_string N IsT : is_list is_string N1 IsF : is_list is_string N2 App : N ++ N1 = L3 IsL3 : is_list is_string L3 ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< apply append_list_string_total to IsL3 IsF. Subgoal 2.21: Variables: Ctx Expr Expr1 Expr2 N N1 N2 L3 L1 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 (condExpr Expr2 Expr1 Expr) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr2 * IsE2 : is_expr Expr1 * IsE3 : is_expr Expr * ENC : exprNames Ctx Expr2 N ENT : exprNames Ctx Expr1 N1 ENF : exprNames Ctx Expr N2 IsC : is_list is_string N IsT : is_list is_string N1 IsF : is_list is_string N2 App : N ++ N1 = L3 IsL3 : is_list is_string L3 H1 : L3 ++ N2 = L1 ============================ exists N, exprNames Ctx (condExpr Expr2 Expr1 Expr) N
< search. Proof completed.
< Prove exactEval:host:stmtNames_not_in_ctx, exactEval:host:exprNames_not_in_ctx. Subgoal 2.22: Variables: Ctx N X CN TN FN N2 F T C 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 (condExpr C T F) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (condExpr C T F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N ============================ false
< case IsE. Subgoal 2.22: Variables: Ctx N X CN TN FN N2 F T C 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 (condExpr C T F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ false
< Or: apply mem_append to MemN EN5. Subgoal 2.22: Variables: Ctx N X CN TN FN N2 F T C 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 (condExpr C T F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F Or : mem X N2 \/ mem X FN ============================ false
< M: case Or. Subgoal 2.22.1: Variables: Ctx N X CN TN FN N2 F T C 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 (condExpr C T F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F M : mem X N2 ============================ false
< Or: apply mem_append to M EN4. Subgoal 2.22.1: Variables: Ctx N X CN TN FN N2 F T C 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 (condExpr C T F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F M : mem X N2 Or : mem X CN \/ mem X TN ============================ false
< M': case Or. Subgoal 2.22.1.1: Variables: Ctx N X CN TN FN N2 F T C 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 (condExpr C T F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F M : mem X N2 M' : mem X CN ============================ false
< apply IH_E to _ _ EN1 M' MemsCtx. Subgoal 2.22.1.2: Variables: Ctx N X CN TN FN N2 F T C 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 (condExpr C T F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F M : mem X N2 M' : mem X TN ============================ false
< apply IH_E to _ _ EN2 M' MemsCtx. Subgoal 2.22.2: Variables: Ctx N X CN TN FN N2 F T C 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 (condExpr C T F) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx C CN * EN2 : exprNames Ctx T TN * EN3 : exprNames Ctx F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F M : mem X FN ============================ false
< apply IH_E to _ _ EN3 M 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 4.22: Variables: CtxA CtxB N CN TN FN N2 F T C 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 (condExpr C T F) 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 (condExpr C T F) N @ EN1 : exprNames CtxA C CN * EN2 : exprNames CtxA T TN * EN3 : exprNames CtxA F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N ============================ exprNames CtxB (condExpr C T F) N
< case IsE. Subgoal 4.22: Variables: CtxA CtxB N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames CtxA C CN * EN2 : exprNames CtxA T TN * EN3 : exprNames CtxA F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ exprNames CtxB (condExpr C T F) N
< apply IH_E to _ _ _ RelAB RelBA EN1. Subgoal 4.22: Variables: CtxA CtxB N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames CtxA C CN * EN2 : exprNames CtxA T TN * EN3 : exprNames CtxA F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : exprNames CtxB C CN ============================ exprNames CtxB (condExpr C T F) N
< apply IH_E to _ _ _ RelAB RelBA EN2. Subgoal 4.22: Variables: CtxA CtxB N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames CtxA C CN * EN2 : exprNames CtxA T TN * EN3 : exprNames CtxA F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : exprNames CtxB C CN H5 : exprNames CtxB T TN ============================ exprNames CtxB (condExpr C T F) N
< apply IH_E to _ _ _ RelAB RelBA EN3. Subgoal 4.22: Variables: CtxA CtxB N CN TN FN N2 F T C 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 (condExpr C T F) N @ EN1 : exprNames CtxA C CN * EN2 : exprNames CtxA T TN * EN3 : exprNames CtxA F FN * EN4 : CN ++ TN = N2 EN5 : N2 ++ FN = N H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : exprNames CtxB C CN H5 : exprNames CtxB T TN H6 : exprNames CtxB F FN ============================ exprNames CtxB (condExpr C T F) N
< search. Proof completed.
< Prove exactEval:host:stmtNames_increaseCtxs, exactEval:host:stmtNames_increaseCtxs_ctxs, exactEval:host:exprNames_increaseCtxs. Subgoal 3.22: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C 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 (condExpr C T F) 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 (condExpr C T F) NA @ ENB : exprNames CtxB (condExpr C T F) NB M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA ============================ mem X NA
< case IsE. Subgoal 3.22: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C 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 (condExpr C T F) NA @ ENB : exprNames CtxB (condExpr C T F) NB M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ mem X NA
< ENB: case ENB. Subgoal 3.22: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB ============================ mem X NA
< Or: apply mem_append to M ENB4. Subgoal 3.22: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB Or : mem X N2 \/ mem X FN1 ============================ mem X NA
< M': case Or. Subgoal 3.22.1: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 ============================ mem X NA
< Or: apply mem_append to M' ENB3. Subgoal 3.22.1: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 Or : mem X CN1 \/ mem X TN1 ============================ mem X NA
< M'': case Or. Subgoal 3.22.1.1: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X CN1 ============================ mem X NA
< MC: apply IH_E to _ _ _ _ ENA1 ENB M''. Subgoal 3.22.1.1: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X CN1 MC : mem X CN ============================ mem X NA
< M1: apply mem_append_left to MC ENA4. Subgoal 3.22.1.1: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X CN1 MC : mem X CN M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA5. Subgoal 3.22.1.1: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X CN1 MC : mem X CN M1 : mem X N1 H4 : mem X NA ============================ mem X NA
< search. Subgoal 3.22.1.2: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 ============================ mem X NA
< MT: apply IH_E to _ _ _ _ ENA2 ENB1 M''. Subgoal 3.22.1.2: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 MT : mem X TN ============================ mem X NA
< M1: apply mem_append_right to MT ENA4. Subgoal 3.22.1.2: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 MT : mem X TN M1 : mem X N1 ============================ mem X NA
< apply mem_append_left to M1 ENA5. Subgoal 3.22.1.2: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X N2 M'' : mem X TN1 MT : mem X TN M1 : mem X N1 H4 : mem X NA ============================ mem X NA
< search. Subgoal 3.22.2: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X FN1 ============================ mem X NA
< MF: apply IH_E to _ _ _ _ ENA3 ENB2 M'. Subgoal 3.22.2: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X FN1 MF : mem X FN ============================ mem X NA
< apply mem_append_right to MF ENA5. Subgoal 3.22.2: Variables: CtxA NA CtxB NB X CN TN FN N1 F T C CN1 TN1 FN1 N2 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 (condExpr C T F) NA @ M : mem X NB ENA1 : exprNames CtxA C CN * ENA2 : exprNames CtxA T TN * ENA3 : exprNames CtxA F FN * ENA4 : CN ++ TN = N1 ENA5 : N1 ++ FN = NA H1 : is_expr C H2 : is_expr T H3 : is_expr F ENB : exprNames CtxB C CN1 ENB1 : exprNames CtxB T TN1 ENB2 : exprNames CtxB F FN1 ENB3 : CN1 ++ TN1 = N2 ENB4 : N2 ++ FN1 = NB M' : mem X FN1 MF : mem X FN H4 : mem X NA ============================ mem X NA
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_exprNames. Variables: Names Ctx N N_P X X1 F T C Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsE : is_expr (condExpr C T F) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (condExpr C T F) N EN_P : exprNames Ctx (stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1)) N_P M : mem X N_P Pr1 : fresh_name "X" Names X1 ============================ mem X N
< case IsE. Variables: Names Ctx N N_P X X1 F T C Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (condExpr C T F) N EN_P : exprNames Ctx (stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1)) N_P M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ mem X N
< EN: case EN. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx (stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1)) N_P M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N ============================ mem X N
< EN_P: case EN_P. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CtxS NE Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : stmtNames ([]::Ctx) (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) NS CtxS EN_P1 : exprNames CtxS (name X1) NE EN_P2 : NS ++ NE = N_P ============================ mem X N
< EN_P: case EN_P. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CtxS NE N1 Ctx3 N3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P1 : exprNames CtxS (name X1) NE EN_P2 : NS ++ NE = N_P EN_P : stmtNames ([]::Ctx) (declare intTy X1 (num 0)) N1 Ctx3 EN_P3 : stmtNames Ctx3 (ifThenElse C (assign X1 T) (assign X1 F)) N3 CtxS EN_P4 : N1 ++ N3 = NS ============================ mem X N
< EN_P: case EN_P. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CtxS NE N1 N3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P1 : exprNames CtxS (name X1) NE EN_P2 : NS ++ NE = N_P EN_P3 : stmtNames ([X1]::Ctx) (ifThenElse C (assign X1 T) (assign X1 F)) N3 CtxS EN_P4 : N1 ++ N3 = NS EN_P : exprNames ([]::Ctx) (num 0) N1 ============================ mem X N
< case EN_P. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CtxS NE N3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P1 : exprNames CtxS (name X1) NE EN_P2 : NS ++ NE = N_P EN_P3 : stmtNames ([X1]::Ctx) (ifThenElse C (assign X1 T) (assign X1 F)) N3 CtxS EN_P4 : [] ++ N3 = NS ============================ mem X N
< case EN_P4. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CtxS NE Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P1 : exprNames CtxS (name X1) NE EN_P2 : NS ++ NE = N_P EN_P3 : stmtNames ([X1]::Ctx) (ifThenElse C (assign X1 T) (assign X1 F)) NS CtxS ============================ mem X N
< EN_P: case EN_P3. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS NE CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P1 : exprNames ([X1]::Ctx) (name X1) NE EN_P2 : NS ++ NE = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = NS ============================ mem X N
< Eq: assert NE = []. Subgoal 1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS NE CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P1 : exprNames ([X1]::Ctx) (name X1) NE EN_P2 : NS ++ NE = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = NS ============================ NE = []
< M': case EN_P1. Subgoal 1.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P2 : NS ++ [] = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = NS M' : mems X1 ([X1]::Ctx) ============================ [] = []
< search. Subgoal 1.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P2 : NS ++ [X1] = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = NS M' : not_mems X1 ([X1]::Ctx) ============================ [X1] = []
< NM: case M'. Subgoal 1.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P2 : NS ++ [X1] = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = NS NM : not_mem X1 [X1] NM1 : not_mems X1 Ctx ============================ [X1] = []
< N: case NM. Subgoal 1.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P2 : NS ++ [X1] = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = NS NM1 : not_mems X1 Ctx N : X1 = X1 -> false N1 : not_mem X1 [] ============================ [X1] = []
< apply N to _. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS NE CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P1 : exprNames ([X1]::Ctx) (name X1) NE EN_P2 : NS ++ NE = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = NS Eq : NE = [] ============================ mem X N
< clear EN_P1. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS NE CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P2 : NS ++ NE = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = NS Eq : NE = [] ============================ mem X N
< case Eq. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 NS CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P2 : NS ++ [] = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = NS ============================ mem X N
< apply append_nil_right to EN_P2. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P2 : N_P ++ [] = N_P EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P ============================ mem X N
< clear EN_P2. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P ============================ mem X N
< apply fresh_name_is to _ Pr1. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 ============================ mem X N
< Or: apply mem_append to M EN_P6. Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 Or : mem X N4 \/ mem X FN1 ============================ mem X N
< M': case Or. Subgoal 2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 ============================ mem X N
< Or: apply mem_append to M' EN_P5. Subgoal 2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 Or : mem X CN1 \/ mem X TN1 ============================ mem X N
< M'': case Or. Subgoal 2.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X CN1 ============================ mem X N
< MC: apply exprNames_increaseCtxs to _ _ _ _ EN EN_P M''. Subgoal 2.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X CN1 MC : mem X CN ============================ mem X N
< M1: apply mem_append_left to MC EN3. Subgoal 2.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X CN1 MC : mem X CN M1 : mem X N2 ============================ mem X N
< apply mem_append_left to M1 EN4. Subgoal 2.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X CN1 MC : mem X CN M1 : mem X N2 H5 : mem X N ============================ mem X N
< search. Subgoal 2.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X TN1 ============================ mem X N
< AN: case EN_P3. Subgoal 2.2.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X TN1 AN : mems X1 ([]::([X1]::Ctx)) AN1 : exprNames ([]::([X1]::Ctx)) T TN1 ============================ mem X N
< MT: apply exprNames_increaseCtxs to _ _ _ _ EN1 AN1 M''. Subgoal 2.2.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X TN1 AN : mems X1 ([]::([X1]::Ctx)) AN1 : exprNames ([]::([X1]::Ctx)) T TN1 MT : mem X TN ============================ mem X N
< M1: apply mem_append_right to MT EN3. Subgoal 2.2.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X TN1 AN : mems X1 ([]::([X1]::Ctx)) AN1 : exprNames ([]::([X1]::Ctx)) T TN1 MT : mem X TN M1 : mem X N2 ============================ mem X N
< apply mem_append_left to M1 EN4. Subgoal 2.2.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X TN1 AN : mems X1 ([]::([X1]::Ctx)) AN1 : exprNames ([]::([X1]::Ctx)) T TN1 MT : mem X TN M1 : mem X N2 H5 : mem X N ============================ mem X N
< search. Subgoal 2.2.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 FN1 CtxF N4 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ X1::N5 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X (X1::N5) AN : not_mems X1 ([]::([X1]::Ctx)) AN1 : exprNames ([]::([X1]::Ctx)) T N5 ============================ mem X N
< MN: case AN. Subgoal 2.2.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 FN1 CtxF N4 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ X1::N5 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X (X1::N5) AN1 : exprNames ([]::([X1]::Ctx)) T N5 MN : not_mem X1 [] MN1 : not_mems X1 ([X1]::Ctx) ============================ mem X N
< MN: case MN1. Subgoal 2.2.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 FN1 CtxF N4 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ X1::N5 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X (X1::N5) AN1 : exprNames ([]::([X1]::Ctx)) T N5 MN : not_mem X1 [] MN1 : not_mem X1 [X1] MN2 : not_mems X1 Ctx ============================ mem X N
< N: case MN1. Subgoal 2.2.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 FN1 CtxF N4 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ X1::N5 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X N4 M'' : mem X (X1::N5) AN1 : exprNames ([]::([X1]::Ctx)) T N5 MN : not_mem X1 [] MN2 : not_mems X1 Ctx N : X1 = X1 -> false N1 : not_mem X1 [] ============================ mem X N
< apply N to _. Subgoal 3: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 CtxF N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P4 : stmtNames ([]::([X1]::Ctx)) (assign X1 F) FN1 CtxF EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X FN1 ============================ mem X N
< AN: case EN_P4. Subgoal 3.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X FN1 AN : mems X1 ([]::([X1]::Ctx)) AN1 : exprNames ([]::([X1]::Ctx)) F FN1 ============================ mem X N
< MF: apply exprNames_increaseCtxs to _ _ _ _ EN2 AN1 M'. Subgoal 3.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X FN1 AN : mems X1 ([]::([X1]::Ctx)) AN1 : exprNames ([]::([X1]::Ctx)) F FN1 MF : mem X FN ============================ mem X N
< apply mem_append_right to MF EN4. Subgoal 3.1: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT FN1 N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ FN1 = N_P H4 : is_string X1 M' : mem X FN1 AN : mems X1 ([]::([X1]::Ctx)) AN1 : exprNames ([]::([X1]::Ctx)) F FN1 MF : mem X FN H5 : mem X N ============================ mem X N
< search. Subgoal 3.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT N4 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ X1::N5 = N_P H4 : is_string X1 M' : mem X (X1::N5) AN : not_mems X1 ([]::([X1]::Ctx)) AN1 : exprNames ([]::([X1]::Ctx)) F N5 ============================ mem X N
< MN: case AN. Subgoal 3.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT N4 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ X1::N5 = N_P H4 : is_string X1 M' : mem X (X1::N5) AN1 : exprNames ([]::([X1]::Ctx)) F N5 MN : not_mem X1 [] MN1 : not_mems X1 ([X1]::Ctx) ============================ mem X N
< MN: case MN1. Subgoal 3.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT N4 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ X1::N5 = N_P H4 : is_string X1 M' : mem X (X1::N5) AN1 : exprNames ([]::([X1]::Ctx)) F N5 MN : not_mem X1 [] MN1 : not_mem X1 [X1] MN2 : not_mems X1 Ctx ============================ mem X N
< N: case MN1. Subgoal 3.2: Variables: Names Ctx N N_P X X1 F T C CN TN FN N2 CN1 TN1 CtxT N4 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X1 (num 0)) (ifThenElse C (assign X1 T) (assign X1 F))) (name X1) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx M : mem X N_P Pr1 : fresh_name "X" Names X1 H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N EN_P : exprNames ([X1]::Ctx) C CN1 EN_P3 : stmtNames ([]::([X1]::Ctx)) (assign X1 T) TN1 CtxT EN_P5 : CN1 ++ TN1 = N4 EN_P6 : N4 ++ X1::N5 = N_P H4 : is_string X1 M' : mem X (X1::N5) AN1 : exprNames ([]::([X1]::Ctx)) F N5 MN : not_mem X1 [] MN2 : not_mems X1 Ctx N : X1 = X1 -> false N1 : not_mem X1 [] ============================ mem X N
< apply N to _. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_backward. Proof completed.
< Prove exactEval:host:typeOf_isTy, exactEval:host:stmtOK_isCtx. Subgoal 1.23: Variables: FT ET Ty F T C 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 (condExpr C T F) IsFT : is_list (is_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 (condExpr C T F) Ty @ Ty1 : typeOf FT ET C boolTy * Ty2 : typeOf FT ET T Ty * Ty3 : typeOf FT ET F Ty * ============================ is_typ Ty
< case IsE. Subgoal 1.23: Variables: FT ET Ty F T C 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 (condExpr C T F) Ty @ Ty1 : typeOf FT ET C boolTy * Ty2 : typeOf FT ET T Ty * Ty3 : typeOf FT ET F Ty * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_typ Ty
< apply IH to _ _ _ Ty2. Subgoal 1.23: Variables: FT ET Ty F T C 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 (condExpr C T F) Ty @ Ty1 : typeOf FT ET C boolTy * Ty2 : typeOf FT ET T Ty * Ty3 : typeOf FT ET F Ty * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_typ Ty ============================ is_typ Ty
< search. Proof completed.
< Prove exactEval:host:stmtOK_keep_scopes. Proof completed.
< Prove exactEval:host:stmtOK_older_scopes_same. Proof completed.
< Prove exactEval:host:stmtOK_first_scope_lookup_same. Proof completed.
< Prove exactEval:host:typeOf_unique, exactEval:host:stmtOK_unique. Subgoal 1.23: Variables: FT ET_A ET_B TyA TyB F T C 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 (condExpr C T F) 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 (condExpr C T F) TyA @ TyB : typeOf FT ET_B (condExpr C T F) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A C boolTy * TyA2 : typeOf FT ET_A T TyA * TyA3 : typeOf FT ET_A F TyA * ============================ TyA = TyB
< case IsE. Subgoal 1.23: Variables: FT ET_A ET_B TyA TyB F T C 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 (condExpr C T F) TyA @ TyB : typeOf FT ET_B (condExpr C T F) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A C boolTy * TyA2 : typeOf FT ET_A T TyA * TyA3 : typeOf FT ET_A F TyA * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ TyA = TyB
< TyB: case TyB. Subgoal 1.23: Variables: FT ET_A ET_B TyA TyB F T C 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 (condExpr C T F) TyA @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A C boolTy * TyA2 : typeOf FT ET_A T TyA * TyA3 : typeOf FT ET_A F TyA * H1 : is_expr C H2 : is_expr T H3 : is_expr F TyB : typeOf FT ET_B C boolTy TyB1 : typeOf FT ET_B T TyB TyB2 : typeOf FT ET_B F TyB ============================ TyA = TyB
< apply IH_E to _ _ _ _ TyA2 TyB1 _. Subgoal 1.23: Variables: FT ET_A ET_B TyB F T C 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 (condExpr C T F) TyB @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A C boolTy * TyA2 : typeOf FT ET_A T TyB * TyA3 : typeOf FT ET_A F TyB * H1 : is_expr C H2 : is_expr T H3 : is_expr F TyB : typeOf FT ET_B C boolTy TyB1 : typeOf FT ET_B T TyB TyB2 : typeOf FT ET_B F TyB ============================ TyB = TyB
< 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.
< 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. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsE. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F 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_C_E to _ _ _ Ev2. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsE. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F 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_C_E to _ _ _ Ev2. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 2.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_value V
< case IsE. Subgoal 2.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_value V
< apply IH_C_E to _ _ _ Ev1. Subgoal 2.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value V
< apply IH_V_E to _ _ _ Ev2. Subgoal 2.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value V ============================ is_value V
< search. Subgoal 2.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_value V
< case IsE. Subgoal 2.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_value V
< apply IH_C_E to _ _ _ Ev1. Subgoal 2.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_value V
< apply IH_V_E to _ _ _ Ev2. Subgoal 2.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_value V ============================ is_value V
< search. Proof completed.
< Prove exactEval:host:evalExpr_isOutput, exactEval:host:evalStmt_isOutput, exactEval:host:evalArgs_isOutput, exactEval:host:evalRecFields_isOutput. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 H6 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 1.27: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 H6 : is_list is_value O3 H7 : is_list is_value O ============================ is_list is_value O
< search. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O ============================ is_list is_value O
< case IsE. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ is_list is_value O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 ============================ is_list is_value O
< apply IH_E to _ _ _ Ev2. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 H6 : is_list is_value O3 ============================ is_list is_value O
< apply append_values_is to _ _ Ev3. Subgoal 1.28: Variables: FE EE EE' V O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list is_value O2 H6 : is_list is_value O3 H7 : 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. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F NS1 : names_same EE EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ names_same EE EE'
< NS2: apply IH_E to _ _ _ Ev2. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F NS1 : names_same EE EE3 H4 : 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.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F NS1 : names_same EE EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H5 : names_same EE EE' ============================ names_same EE EE'
< search. Subgoal 1.28: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O ============================ names_same EE EE'
< case IsE. Subgoal 1.28: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ names_same EE EE'
< NS1: apply IH_E to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F NS1 : names_same EE EE3 ============================ names_same EE EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F NS1 : names_same EE EE3 H4 : 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 V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F NS1 : names_same EE EE3 H4 : 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 V EE' O EE3 O2 O3 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F NS1 : names_same EE EE3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 NS2 : names_same EE3 EE' H5 : names_same EE EE' ============================ names_same EE EE'
< 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. Subgoal 1.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ VA = VB
< case IsE. Subgoal 1.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ VA = VB
< EvB: case EvB. Subgoal 1.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ VA = VB
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 ============================ VA = VB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.27.1: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VB EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VB EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VB = VB
< search. Subgoal 1.27.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.28: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ VA = VB
< case IsE. Subgoal 1.28: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ VA = VB
< EvB: case EvB. Subgoal 1.28.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ VA = VB
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 1.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 ============================ VA = VB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA2 EvB1 _. Subgoal 1.28.2: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VB EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VB EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ VB = VB
< search. Subgoal 2.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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_E to _ _ _ _ EvA1 EvB _. Subgoal 2.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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 2.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len EE1 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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 2.27.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.28: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ O_A = O_B
< case IsE. Subgoal 2.28: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.28.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 2.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 2.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ O_A = O_B
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 2.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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_E to _ _ _ _ EvA1 EvB _. Subgoal 2.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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_E to _ _ _ _ EvA2 EvB1 _. Subgoal 2.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O4 * EvA3 : O3 ++ O4 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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 2.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len EE1 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O4 * EvA3 : O3 ++ O4 = O_B H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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 3.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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 3.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.27.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 3.27.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.28: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA 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 VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.28.1: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 3.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB 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.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 3.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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 3.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 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'
< apply IH_C_E to _ _ _ _ EvA2 EvB1 _. Subgoal 3.28.2: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = O_A H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = O_B H4 : newNameScopes N Len EE1 EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : is_list (is_list (is_pair is_string is_value)) EE2 H7 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Proof completed.
< Add_Ext_Size exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt. Proof completed.
< Add_Proj_Rel exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt. 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. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C trueVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 T V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< case IsE. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C trueVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 T V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB3 NNS. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C trueVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 T V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C trueVal EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C trueVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 T V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C trueVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C trueVal EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C trueVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 T V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C trueVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C trueVal EE_A' O2 EvB1' : evalExpr FE EE_B C trueVal EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C trueVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 T V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C trueVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C trueVal EE_A' O2 EvB1' : evalExpr FE EE_B C trueVal EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C trueVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 T V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C trueVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C trueVal EE_A' O2 EvB1' : evalExpr FE EE_B C trueVal EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C trueVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 T V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C trueVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C trueVal EE_A' O2 EvB1' : evalExpr FE EE_B C trueVal EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< apply IH_E to _ _ _ _ EvB4 NNS'. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C trueVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 T V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C trueVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C trueVal EE_A' O2 EvB1' : evalExpr FE EE_B C trueVal EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : <evalExpr {ES}> FE EE_A' T V EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< search. Subgoal 1.28: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C falseVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 F V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< case IsE. Subgoal 1.28: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C falseVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 F V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< EvA1: apply IH_E to _ _ _ _ EvB3 NNS. Subgoal 1.28: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C falseVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 F V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C falseVal EE_A' O2 N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 1.28: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C falseVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 F V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C falseVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C falseVal EE_A' O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB3. Subgoal 1.28: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C falseVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 F V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C falseVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C falseVal EE_A' O2 EvB1' : evalExpr FE EE_B C falseVal EE1 O2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1' EvB1' NNS. Subgoal 1.28: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C falseVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 F V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C falseVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C falseVal EE_A' O2 EvB1' : evalExpr FE EE_B C falseVal EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvA1'. Subgoal 1.28: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C falseVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 F V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C falseVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C falseVal EE_A' O2 EvB1' : evalExpr FE EE_B C falseVal EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< apply evalExpr_isCtx to _ _ _ EvB1'. Subgoal 1.28: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C falseVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 F V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C falseVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C falseVal EE_A' O2 EvB1' : evalExpr FE EE_B C falseVal EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V EE_A' O ES
< apply IH_E to _ _ _ _ EvB4 NNS'. Subgoal 1.28: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 N3 N4 EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) 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 C falseVal EE1 O2 N2 * EvB4 : <evalExpr {ES}> FE EE1 F V EE_B' O3 N3 * EvB5 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvA1 : <evalExpr {ES}> FE EE_A C falseVal EE_A' O2 N2 EvA1' : evalExpr FE EE_A C falseVal EE_A' O2 EvB1' : evalExpr FE EE_B C falseVal EE1 O2 NNS' : newNameScopes N Len EE_A' EE1 H4 : is_list (is_list (is_pair is_string is_value)) EE_A' H5 : is_list (is_list (is_pair is_string is_value)) EE1 H6 : <evalExpr {ES}> FE EE_A' F V EE_A'1 O3 N3 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (condExpr C T F) V 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. Subgoal 1.27: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) N Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.27: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) N Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.27: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.27: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N Ctxs' : ctx_names EE3 Ctx H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN1 Ev2. Subgoal 1.27: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N Ctxs' : ctx_names EE3 Ctx H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Subgoal 1.28: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) N Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.28: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) N Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.28: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N ============================ ctx_names EE' Ctx
< Ctxs': apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.28: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N Ctxs' : ctx_names EE3 Ctx ============================ ctx_names EE' Ctx
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N Ctxs' : ctx_names EE3 Ctx H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs' EN2 Ev2. Subgoal 1.28: Variables: FE EE V EE' O Ctx N EE3 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = N Ctxs' : ctx_names EE3 Ctx H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : 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. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) [] EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< case IsE. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) [] EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< EN: case EN. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = [] ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< case EN4. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C CN TN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F [] EN3 : CN ++ TN = [] ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< case EN3. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ _ EN EvA1 NNS. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C trueVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C trueVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C trueVal 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', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C trueVal 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' NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ Ctxs EN EvB1. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C trueVal 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' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply IH_E to _ _ _ _ _ _ EN1 EvA2 NNS'. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C trueVal 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' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names EE_B' Ctx H7 : evalExpr FE EE_B' T V EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< search. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) [] EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< case IsE. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) [] EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< EN: case EN. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C CN TN FN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N2 EN4 : N2 ++ FN = [] ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< case EN4. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C CN TN 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F [] EN3 : CN ++ TN = [] ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< case EN3. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< EvB1: apply IH_E to _ _ _ _ _ _ EN EvA1 NNS. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C falseVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C falseVal EE_B' O2 H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C falseVal 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', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA1 EvB1 NNS. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C falseVal 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' NNS' : newNameScopes N Len EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_ctx_names to _ _ _ _ Ctxs EN EvB1. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C falseVal 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' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names EE_B' Ctx ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply IH_E to _ _ _ _ _ _ EN2 EvA2 NNS'. Subgoal 1.28: Variables: FE EE_A EE_B V Ctx EE_A' O N Len EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_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 (condExpr C T F) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] EvB1 : evalExpr FE EE_B C falseVal 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' NNS' : newNameScopes N Len EE1 EE_B' H6 : ctx_names EE_B' Ctx H7 : evalExpr FE EE_B' F V EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< search. Proof completed.
< Theorem append_values_total : forall LA LB, is_list is_value LA -> exists L, LA ++ LB = L. ============================ forall LA LB, is_list is_value LA -> exists L, LA ++ LB = L
< induction on 1. IH : forall LA LB, is_list is_value LA * -> exists L, LA ++ LB = L ============================ forall LA LB, is_list is_value LA @ -> exists L, LA ++ LB = L
< intros Is. Variables: LA LB IH : forall LA LB, is_list is_value LA * -> exists L, LA ++ LB = L Is : is_list is_value LA @ ============================ exists L, LA ++ LB = L
< Is: case Is. Subgoal 1: Variables: LB IH : forall LA LB, is_list is_value LA * -> exists L, LA ++ LB = L ============================ exists L, [] ++ LB = L
< search. Subgoal 2: Variables: LB T H IH : forall LA LB, is_list is_value LA * -> exists L, LA ++ LB = L Is : is_value H Is1 : is_list is_value T * ============================ exists L, H::T ++ LB = L
< apply IH to Is1 with LB = LB. Subgoal 2: Variables: LB T H L IH : forall LA LB, is_list is_value LA * -> exists L, LA ++ LB = L Is : is_value H Is1 : is_list is_value T * H1 : T ++ LB = L ============================ exists L, H::T ++ LB = L
< 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. Subgoal 1.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' OB EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' OB EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : 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)) EE2 ============================ VA = VB /\ OA = OB
< SS': apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 1.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 ============================ VA = VB /\ OA = OB
< apply scopes_same_add_scope to SS'. Subgoal 1.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.27.1: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VB EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VB EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) ============================ VB = VB /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.27.1: Variables: FE EE_A EE_A' EE_B VB EE_B' OB EE1 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VB EE_A' OB @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VB EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) ============================ VB = VB /\ OB = OB
< search. Subgoal 1.27.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.28: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' OB EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.28: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' OB EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.28.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 1.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ VA = VB /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = OB H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ VA = VB /\ OA = OB
< apply evalExpr_isCtx to _ _ _ EvB. Subgoal 1.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : 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)) EE2 ============================ VA = VB /\ OA = OB
< SS': apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 1.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 ============================ VA = VB /\ OA = OB
< apply scopes_same_add_scope to SS'. Subgoal 1.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 1.28.2: Variables: FE EE_A EE_A' OA EE_B VB EE_B' OB EE1 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VB EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VB EE_A' O4 * EvA3 : O3 ++ O4 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) ============================ VB = VB /\ OA = OB
< apply append_unique to EvA3 EvB2. Subgoal 1.28.2: Variables: FE EE_A EE_A' EE_B VB EE_B' OB EE1 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VB EE_A' OB @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VB EE_A' O4 * EvA3 : O3 ++ O4 = OB H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) ============================ VB = VB /\ OB = OB
< search. Subgoal 2.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' OB EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' OB EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = OB 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.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : 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)) EE2 ============================ scopes_same EE_A' EE_B'
< SS': apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS'. Subgoal 2.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) ============================ scopes_same EE_A' EE_B'
< SS'': apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.27.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O3 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) SS'' : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Subgoal 2.27.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C trueVal EE1 O1 * EvA2 : evalExpr FE EE1 T VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.28: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' OB EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.28: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvB : evalExpr FE EE_B (condExpr C T F) VB EE_B' OB EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.28.1: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C trueVal EE2 O3 EvB1 : evalExpr FE EE2 T VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O1 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O1 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA1 EvB. Subgoal 2.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 2.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : O3 ++ O4 = OB 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.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : 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)) EE2 ============================ scopes_same EE_A' EE_B'
< SS': apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 2.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_add_scope to SS'. Subgoal 2.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) ============================ scopes_same EE_A' EE_B'
< SS'': apply IH_E_C to _ _ _ _ _ EvA2 EvB1. Subgoal 2.28.2: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB EE1 O2 F T C 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' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) VA EE_A' OA @ EvA1 : evalExpr FE EE_A C falseVal EE1 O3 * EvA2 : evalExpr FE EE1 F VA EE_A' O2 * EvA3 : O3 ++ O2 = OA H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB : evalExpr FE EE_B C falseVal EE2 O3 EvB1 : evalExpr FE EE2 F VB EE_B' O4 EvB2 : 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)) EE2 SS' : scopes_same EE1 EE2 H6 : scopes_same ([]::EE1) ([]::EE2) SS'' : 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. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< case IsE. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C trueVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C trueVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C trueVal 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', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C trueVal EE1 O2 * EvA2 : evalExpr FE EE1 T V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C trueVal 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 : evalExpr FE EE_B' T V EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< search. Subgoal 1.28: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< case IsE. Subgoal 1.28: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.28: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C falseVal EE_B' O2 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< SS': apply evalExpr_scopes_same_ctx to _ _ _ _ _ EvA1 EvB1. Subgoal 1.28: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvA1. Subgoal 1.28: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C falseVal EE_B' O2 SS' : scopes_same EE1 EE_B' H4 : is_list (is_list (is_pair is_string is_value)) EE1 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply evalExpr_isCtx to _ _ _ EvB1. Subgoal 1.28: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C falseVal 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', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< apply IH_E to _ _ _ _ SS' EvA2. Subgoal 1.28: Variables: FE EE_A V EE_A' O EE_B EE1 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (condExpr C T F) V EE_A' O @ EvA1 : evalExpr FE EE_A C falseVal EE1 O2 * EvA2 : evalExpr FE EE1 F V EE_A' O3 * EvA3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F EvB1 : evalExpr FE EE_B C falseVal 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 : evalExpr FE EE_B' F V EE_B'1 O3 ============================ exists EE_B', evalExpr FE EE_B (condExpr C T F) V EE_B' O
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_forward. Variables: Names FE EE V EE' O X F T C Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< L: apply length_exists_list_pair_string_value to IsEE. Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< EvD: assert evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) []. Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS: assert newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE. Subgoal 1: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE
< unfold . Subgoal 1: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ exists N1 SNames BNames, ((((length EE N /\ drop N1 ([(X, intVal 0)]::EE) EE) /\ take N1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]) /\ names [[(X, intVal 0)]] SNames) /\ names EE BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< exists 1, [X], Names. Subgoal 1: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ ((((length EE N /\ drop 1 ([(X, intVal 0)]::EE) EE) /\ take 1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]) /\ names [[(X, intVal 0)]] [X]) /\ names EE Names) /\ (forall X1, mem X1 [X] -> mem X1 Names -> false)
< split. Subgoal 1.1: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ length EE N
< search. Subgoal 1.2: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ drop 1 ([(X, intVal 0)]::EE) EE
< search. Subgoal 1.3: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ take 1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]
< search. Subgoal 1.4: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ names [[(X, intVal 0)]] [X]
< search. Subgoal 1.5: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ names EE Names
< search. Subgoal 1.6: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ forall X1, mem X1 [X] -> mem X1 Names -> false
< intros MX MN. Subgoal 1.6: Variables: Names FE EE V EE' O X F T C N X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] MX : mem X1 [X] MN : mem X1 Names ============================ false
< MX: case MX. Subgoal 1.6.1: Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] MN : mem X Names ============================ false
< apply fresh_name_not_mem to Pr1 MN. Subgoal 1.6.2: Variables: Names FE EE V EE' O X F T C N X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] MN : mem X1 Names MX : mem X1 [] ============================ false
< case MX. Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< IsX: apply fresh_name_is to _ Pr1. Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Is: case IsE. Variables: Names FE EE V EE' O X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< assert is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)). Subgoal 2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE))
< search 6. Subgoal 2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< EvA: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS. Subgoal 2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 EE_A' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA Ev _. Subgoal 2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 EE_A' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 NNS' : newNameScopes [[(X, intVal 0)]] N EE_A' EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS': case NNS' (keep). Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 EE_A' N1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 NNS' : newNameScopes [[(X, intVal 0)]] N EE_A' EE3 NNS'1 : length EE3 N NNS'2 : drop N1 EE_A' EE3 NNS'3 : take N1 EE_A' [[(X, intVal 0)]] NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Take: case NNS'3. Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 N1 SNames BNames N2 L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop N1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N2 = N1 Take1 : take N2 L [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< case Take1. Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 N1 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop N1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = N1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< compute Take. Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Eq: assert L = EE3. Subgoal 2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ L = EE3
< Drop: case NNS'2. Subgoal 2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L N3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L EE3 ============================ L = EE3
< apply drop_is_integer to Drop1. Subgoal 2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L N3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L EE3 H3 : is_integer N3 ============================ L = EE3
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L EE3 H3 : is_integer 0 ============================ L = EE3
< Drop: case Drop1. Subgoal 2.2.1.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 ============================ EE3 = EE3
< search. Subgoal 2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N4 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + N4 = 0 Drop2 : drop N4 L1 EE3 ============================ X1::L1 = EE3
< P: assert 1 + -1 = 0. Subgoal 2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N4 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + N4 = 0 Drop2 : drop N4 L1 EE3 P : 1 + -1 = 0 ============================ X1::L1 = EE3
< apply drop_is_integer to Drop2. Subgoal 2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N4 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + N4 = 0 Drop2 : drop N4 L1 EE3 P : 1 + -1 = 0 H4 : is_integer N4 ============================ X1::L1 = EE3
< apply plus_integer_unique_addend to _ _ _ Drop1 P. Subgoal 2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H4 : is_integer -1 ============================ X1::L1 = EE3
< GEq: apply drop_geq_0 to Drop2. Subgoal 2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H4 : is_integer -1 GEq : -1 >= 0 ============================ X1::L1 = EE3
< LEq: case GEq. Subgoal 2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H4 : is_integer -1 LEq : 0 <= -1 ============================ X1::L1 = EE3
< case LEq. Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Eq : L = EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ EvA. Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS'': assert newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3. Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< EvA2: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev1 NNS''. Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames EE_A'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS''': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA2 Ev1 _. Subgoal 2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames EE_A'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N EE_A'1 EE' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS''': case NNS'''. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames EE_A'1 N3 SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 NNS''' : length EE' N NNS'''1 : drop N3 EE_A'1 EE' NNS'''2 : take N3 EE_A'1 [[], [(X, intVal 0)]] NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< T: case NNS'''2. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N3 SNames1 BNames1 N4 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::L1) O3 NNS''' : length EE' N NNS'''1 : drop N3 ([]::L1) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N4 = N3 T1 : take N4 L1 [[(X, intVal 0)]] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< T: case T1. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N3 SNames1 BNames1 N4 N6 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop N3 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N4 = N3 T1 : 1 + N6 = N4 T2 : take N6 L2 [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< case T2. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N3 SNames1 BNames1 N4 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop N3 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N4 = N3 T1 : 1 + 0 = N4 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< compute T1. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N3 SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop N3 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = N3 T1 : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< compute T. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Eq: assert L2 = EE'. Subgoal 2.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ L2 = EE'
< Drop: case NNS'''1. Subgoal 2.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 N7 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + N7 = 2 Drop1 : drop N7 ([(X, intVal 0)]::L2) EE' ============================ L2 = EE'
< apply drop_is_integer to Drop1. Subgoal 2.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 N7 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + N7 = 2 Drop1 : drop N7 ([(X, intVal 0)]::L2) EE' H4 : is_integer N7 ============================ L2 = EE'
< apply plus_integer_unique_addend to _ _ _ T Drop. Subgoal 2.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : drop 1 ([(X, intVal 0)]::L2) EE' H4 : is_integer 1 ============================ L2 = EE'
< Drop: case Drop1. Subgoal 2.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 N8 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + N8 = 1 Drop2 : drop N8 L2 EE' ============================ L2 = EE'
< apply drop_is_integer to Drop2. Subgoal 2.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 N8 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + N8 = 1 Drop2 : drop N8 L2 EE' H5 : is_integer N8 ============================ L2 = EE'
< apply plus_integer_unique_addend to _ _ _ T1 Drop1. Subgoal 2.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 Drop2 : drop 0 L2 EE' H5 : is_integer 0 ============================ L2 = EE'
< Drop: case Drop2. Subgoal 2.2.2.1.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 ============================ EE' = EE'
< search. Subgoal 2.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 N11 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + N11 = 0 Drop3 : drop N11 L3 EE' ============================ X1::L3 = EE'
< P: assert 1 + -1 = 0. Subgoal 2.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 N11 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + N11 = 0 Drop3 : drop N11 L3 EE' P : 1 + -1 = 0 ============================ X1::L3 = EE'
< apply drop_is_integer to Drop3. Subgoal 2.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 N11 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + N11 = 0 Drop3 : drop N11 L3 EE' P : 1 + -1 = 0 H6 : is_integer N11 ============================ X1::L3 = EE'
< apply plus_integer_unique_addend to _ _ _ P Drop2. Subgoal 2.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H6 : is_integer -1 ============================ X1::L3 = EE'
< GEq: apply drop_geq_0 to Drop3. Subgoal 2.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H6 : is_integer -1 GEq : -1 >= 0 ============================ X1::L3 = EE'
< LEq: case GEq. Subgoal 2.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H6 : is_integer -1 LEq : 0 <= -1 ============================ X1::L3 = EE'
< case LEq. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Eq : L2 = EE' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< assert replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')). Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< EvA3: assert evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< exists EE'. Subgoal 2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O /\ scopes_same EE' EE'
< split. Subgoal 2.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply evalExpr_isOutput to _ _ _ EvA. Subgoal 2.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply evalExpr_isOutput to _ _ _ EvA2. Subgoal 2.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 H6 : is_list is_value O3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< IsO: apply append_values_is to _ _ Ev2. Subgoal 2.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 H6 : is_list is_value O3 IsO : is_list is_value O ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< App: apply append_values_total to IsO with LB = []. Subgoal 2.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 H6 : is_list is_value O3 IsO : is_list is_value O App : O ++ [] = L3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply append_nil_right to App. Subgoal 2.2.2.2: Variables: Names FE EE V EE' X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = L3 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 H6 : is_list is_value O3 IsO : is_list is_value L3 App : L3 ++ [] = L3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' L3
< search. Subgoal 2.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Subgoal 2.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is': apply evalStmt_isCtx to _ _ _ EvA3. Subgoal 2.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 Is' : is_list (is_list (is_pair is_string is_value)) ([]::([(X, V)]::EE')) ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is': case Is'. Subgoal 2.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 Is' : is_list (is_pair is_string is_value) [] Is'1 : is_list (is_list (is_pair is_string is_value)) ([(X, V)]::EE') ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is': case Is'1. Subgoal 2.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 Is' : is_list (is_pair is_string is_value) [] Is'1 : is_list (is_pair is_string is_value) [(X, V)] Is'2 : 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.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< LenEE3: apply evalExpr_keep_scopes to _ _ _ Ev L. Subgoal 2.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< LenSBR: apply evalExpr_keep_scopes to _ _ _ Ev1 LenEE3. Subgoal 2.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenSBR : length (S::BR) N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< LenBR: case LenSBR. Subgoal 2.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenBR : length BR N' LenBR1 : 1 + N' = N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< apply length_is to LenBR. Subgoal 2.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenBR : length BR N' LenBR1 : 1 + N' = N H4 : is_integer N' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< LEq: apply newNameScopes_length to NNS''' LenBR. Subgoal 2.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenBR : length BR N' LenBR1 : 1 + N' = N H4 : is_integer N' LEq : N <= N' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< Less: apply lt_plus_one to LenBR1 _. Subgoal 2.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenBR : length BR N' LenBR1 : 1 + N' = N H4 : is_integer N' LEq : N <= N' Less : N' < N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< apply less_lesseq_flip_false to Less LEq. Subgoal 2.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< LenSBR: apply evalExpr_keep_scopes to _ _ _ Ev L. Subgoal 2.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenSBR : length (S::BR) N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< LenBR: case LenSBR. Subgoal 2.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< apply length_is to LenBR. Subgoal 2.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H3 : is_integer N' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< LEq: apply newNameScopes_length to NNS'1 LenBR. Subgoal 2.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H3 : is_integer N' LEq : N <= N' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Less: apply lt_plus_one to LenBR1 _. Subgoal 2.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H3 : is_integer N' LEq : N <= N' Less : N' < N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< apply less_lesseq_flip_false to Less LEq. Subgoal 3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< assert is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)). Subgoal 3.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE))
< search 6. Subgoal 3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< EvA: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev NNS. Subgoal 3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 EE_A' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA Ev _. Subgoal 3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 EE_A' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 NNS' : newNameScopes [[(X, intVal 0)]] N EE_A' EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS': case NNS' (keep). Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 EE_A' N1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 NNS' : newNameScopes [[(X, intVal 0)]] N EE_A' EE3 NNS'1 : length EE3 N NNS'2 : drop N1 EE_A' EE3 NNS'3 : take N1 EE_A' [[(X, intVal 0)]] NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Take: case NNS'3. Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 N1 SNames BNames N2 L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop N1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N2 = N1 Take1 : take N2 L [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< case Take1. Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 N1 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop N1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = N1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< compute Take. Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Eq: assert L = EE3. Subgoal 3.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ L = EE3
< Drop: case NNS'2. Subgoal 3.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L N3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L EE3 ============================ L = EE3
< apply drop_is_integer to Drop1. Subgoal 3.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L N3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N3 = 1 Drop1 : drop N3 L EE3 H3 : is_integer N3 ============================ L = EE3
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 3.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L EE3 H3 : is_integer 0 ============================ L = EE3
< Drop: case Drop1. Subgoal 3.2.1.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 ============================ EE3 = EE3
< search. Subgoal 3.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N4 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + N4 = 0 Drop2 : drop N4 L1 EE3 ============================ X1::L1 = EE3
< P: assert 1 + -1 = 0. Subgoal 3.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N4 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + N4 = 0 Drop2 : drop N4 L1 EE3 P : 1 + -1 = 0 ============================ X1::L1 = EE3
< apply drop_is_integer to Drop2. Subgoal 3.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N4 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + N4 = 0 Drop2 : drop N4 L1 EE3 P : 1 + -1 = 0 H4 : is_integer N4 ============================ X1::L1 = EE3
< apply plus_integer_unique_addend to _ _ _ Drop1 P. Subgoal 3.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H4 : is_integer -1 ============================ X1::L1 = EE3
< GEq: apply drop_geq_0 to Drop2. Subgoal 3.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H4 : is_integer -1 GEq : -1 >= 0 ============================ X1::L1 = EE3
< LEq: case GEq. Subgoal 3.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 N NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H3 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H4 : is_integer -1 LEq : 0 <= -1 ============================ X1::L1 = EE3
< case LEq. Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Eq : L = EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ EvA. Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS'': assert newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3. Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< EvA2: apply evalExpr_newNameScopes_exists to _ _ _ _ Ev1 NNS''. Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames EE_A'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS''': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA2 Ev1 _. Subgoal 3.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames EE_A'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N EE_A'1 EE' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< NNS''': case NNS'''. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames EE_A'1 N3 SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 NNS''' : length EE' N NNS'''1 : drop N3 EE_A'1 EE' NNS'''2 : take N3 EE_A'1 [[], [(X, intVal 0)]] NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< T: case NNS'''2. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N3 SNames1 BNames1 N4 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::L1) O3 NNS''' : length EE' N NNS'''1 : drop N3 ([]::L1) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N4 = N3 T1 : take N4 L1 [[(X, intVal 0)]] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< T: case T1. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N3 SNames1 BNames1 N4 N6 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop N3 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N4 = N3 T1 : 1 + N6 = N4 T2 : take N6 L2 [] ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< case T2. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N3 SNames1 BNames1 N4 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop N3 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N4 = N3 T1 : 1 + 0 = N4 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< compute T1. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames N3 SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop N3 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = N3 T1 : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< compute T. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Eq: assert L2 = EE'. Subgoal 3.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ L2 = EE'
< Drop: case NNS'''1. Subgoal 3.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 N7 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + N7 = 2 Drop1 : drop N7 ([(X, intVal 0)]::L2) EE' ============================ L2 = EE'
< apply drop_is_integer to Drop1. Subgoal 3.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 N7 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + N7 = 2 Drop1 : drop N7 ([(X, intVal 0)]::L2) EE' H4 : is_integer N7 ============================ L2 = EE'
< apply plus_integer_unique_addend to _ _ _ T Drop. Subgoal 3.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : drop 1 ([(X, intVal 0)]::L2) EE' H4 : is_integer 1 ============================ L2 = EE'
< Drop: case Drop1. Subgoal 3.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 N8 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + N8 = 1 Drop2 : drop N8 L2 EE' ============================ L2 = EE'
< apply drop_is_integer to Drop2. Subgoal 3.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 N8 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + N8 = 1 Drop2 : drop N8 L2 EE' H5 : is_integer N8 ============================ L2 = EE'
< apply plus_integer_unique_addend to _ _ _ T1 Drop1. Subgoal 3.2.2.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 Drop2 : drop 0 L2 EE' H5 : is_integer 0 ============================ L2 = EE'
< Drop: case Drop2. Subgoal 3.2.2.1.1: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 ============================ EE' = EE'
< search. Subgoal 3.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 N11 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + N11 = 0 Drop3 : drop N11 L3 EE' ============================ X1::L3 = EE'
< P: assert 1 + -1 = 0. Subgoal 3.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 N11 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + N11 = 0 Drop3 : drop N11 L3 EE' P : 1 + -1 = 0 ============================ X1::L3 = EE'
< apply drop_is_integer to Drop3. Subgoal 3.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 N11 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + N11 = 0 Drop3 : drop N11 L3 EE' P : 1 + -1 = 0 H6 : is_integer N11 ============================ X1::L3 = EE'
< apply plus_integer_unique_addend to _ _ _ P Drop2. Subgoal 3.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H6 : is_integer -1 ============================ X1::L3 = EE'
< GEq: apply drop_geq_0 to Drop3. Subgoal 3.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H6 : is_integer -1 GEq : -1 >= 0 ============================ X1::L3 = EE'
< LEq: case GEq. Subgoal 3.2.2.1.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' N NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H4 : is_integer 1 Drop1 : 1 + 0 = 1 H5 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H6 : is_integer -1 LEq : 0 <= -1 ============================ X1::L3 = EE'
< case LEq. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L2 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Eq : L2 = EE' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< assert replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')). Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< EvA3: assert evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< exists EE'. Subgoal 3.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O /\ scopes_same EE' EE'
< split. Subgoal 3.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply evalExpr_isOutput to _ _ _ EvA. Subgoal 3.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply evalExpr_isOutput to _ _ _ EvA2. Subgoal 3.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 H6 : is_list is_value O3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< IsO: apply append_values_is to _ _ Ev2. Subgoal 3.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 H6 : is_list is_value O3 IsO : is_list is_value O ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< App: apply append_values_total to IsO with LB = []. Subgoal 3.2.2.2: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 H6 : is_list is_value O3 IsO : is_list is_value O App : O ++ [] = L3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply append_nil_right to App. Subgoal 3.2.2.2: Variables: Names FE EE V EE' X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 L3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = L3 H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H5 : is_list is_value O2 H6 : is_list is_value O3 IsO : is_list is_value L3 App : L3 ++ [] = L3 ============================ evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' L3
< search. Subgoal 3.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Subgoal 3.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is': apply evalStmt_isCtx to _ _ _ EvA3. Subgoal 3.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 Is' : is_list (is_list (is_pair is_string is_value)) ([]::([(X, V)]::EE')) ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is': case Is'. Subgoal 3.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 Is' : is_list (is_pair is_string is_value) [] Is'1 : is_list (is_list (is_pair is_string is_value)) ([(X, V)]::EE') ============================ is_list (is_list (is_pair is_string is_value)) EE'
< Is': case Is'1. Subgoal 3.2.2.3: Variables: Names FE EE V EE' O X F T C N EE3 O2 O3 SNames BNames SNames1 BNames1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' N NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H4 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3 : evalStmt FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 Is' : is_list (is_pair is_string is_value) [] Is'1 : is_list (is_pair is_string is_value) [(X, V)] Is'2 : 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.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< LenEE3: apply evalExpr_keep_scopes to _ _ _ Ev L. Subgoal 3.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< LenSBR: apply evalExpr_keep_scopes to _ _ _ Ev1 LenEE3. Subgoal 3.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenSBR : length (S::BR) N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< LenBR: case LenSBR. Subgoal 3.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenBR : length BR N' LenBR1 : 1 + N' = N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< apply length_is to LenBR. Subgoal 3.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenBR : length BR N' LenBR1 : 1 + N' = N H4 : is_integer N' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< LEq: apply newNameScopes_length to NNS''' LenBR. Subgoal 3.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenBR : length BR N' LenBR1 : 1 + N' = N H4 : is_integer N' LEq : N <= N' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< Less: apply lt_plus_one to LenBR1 _. Subgoal 3.2.3: Variables: Names FE EE V O X F T C N EE3 O2 O3 SNames BNames BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) EE3 H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 N NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H3 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] N ([]::([(X, intVal 0)]::EE3)) EE3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] N AR BR LenEE3 : length EE3 N LenBR : length BR N' LenBR1 : 1 + N' = N H4 : is_integer N' LEq : N <= N' Less : N' < N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same (S::BR) EE''
< apply less_lesseq_flip_false to Less LEq. Subgoal 3.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< LenSBR: apply evalExpr_keep_scopes to _ _ _ Ev L. Subgoal 3.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenSBR : length (S::BR) N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< LenBR: case LenSBR. Subgoal 3.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< apply length_is to LenBR. Subgoal 3.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H3 : is_integer N' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< LEq: apply newNameScopes_length to NNS'1 LenBR. Subgoal 3.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H3 : is_integer N' LEq : N <= N' ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< Less: apply lt_plus_one to LenBR1 _. Subgoal 3.3: Variables: Names FE EE V EE' O X F T C N O2 O3 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Pr1 : fresh_name "X" Names X L : length EE N EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Is : is_expr C Is1 : is_expr T Is2 : is_expr F Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 Ev2 : O2 ++ O3 = O H1 : is_list (is_list (is_pair is_string is_value)) (S::BR) H2 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] N (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H3 : is_integer N' LEq : N <= N' Less : N' < N ============================ exists EE'', evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE'' O /\ scopes_same EE' EE''
< apply less_lesseq_flip_false to Less LEq. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_backward. Variables: Names FE EE V EE' O Ctx X F T C Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) [] Ev : evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< case IsE. Variables: Names FE EE V EE' O Ctx X F T C Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 (condExpr C T F) [] Ev : evalExpr FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< EN: case EN. Variables: Names FE EE V EE' O Ctx X F T C CN TN FN N1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F FN EN3 : CN ++ TN = N1 EN4 : N1 ++ FN = [] ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< case EN4. Variables: Names FE EE V EE' O Ctx X F T C CN TN Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C CN EN1 : exprNames Ctx T TN EN2 : exprNames Ctx F [] EN3 : CN ++ TN = [] ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< case EN3. Variables: Names FE EE V EE' O Ctx X F T C Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< L: apply length_exists_list_pair_string_value to IsEE. Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< NNS: assert newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE. Subgoal 1: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE
< unfold . Subgoal 1: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ exists N1 SNames BNames, ((((length EE N /\ drop N1 ([(X, intVal 0)]::EE) EE) /\ take N1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]) /\ names [[(X, intVal 0)]] SNames) /\ names EE BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< exists 1, [X], Names. Subgoal 1: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ ((((length EE N /\ drop 1 ([(X, intVal 0)]::EE) EE) /\ take 1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]) /\ names [[(X, intVal 0)]] [X]) /\ names EE Names) /\ (forall X1, mem X1 [X] -> mem X1 Names -> false)
< split. Subgoal 1.1: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ length EE N
< search. Subgoal 1.2: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ drop 1 ([(X, intVal 0)]::EE) EE
< search. Subgoal 1.3: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ take 1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]
< search. Subgoal 1.4: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ names [[(X, intVal 0)]] [X]
< search. Subgoal 1.5: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ names EE Names
< search. Subgoal 1.6: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N ============================ forall X1, mem X1 [X] -> mem X1 Names -> false
< intros MX MN. Subgoal 1.6: Variables: Names FE EE V EE' O Ctx X F T C N X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N MX : mem X1 [X] MN : mem X1 Names ============================ false
< MX: case MX. Subgoal 1.6.1: Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N MN : mem X Names ============================ false
< apply fresh_name_not_mem to Pr1 MN. Subgoal 1.6.2: Variables: Names FE EE V EE' O Ctx X F T C N X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N MN : mem X1 Names MX : mem X1 [] ============================ false
< case MX. Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< IsX: apply fresh_name_is to _ Pr1. Variables: Names FE EE V EE' O Ctx X F T C N Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : 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 X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Variables: Names FE EE V EE' O Ctx X F T C N EE3 O2 Scope O3 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalStmt FE ([]::EE) (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) EE3 O2 Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Variables: Names FE EE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE1 O1 O4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalStmt FE ([]::EE) (declare intTy X (num 0)) EE1 O1 Ev3 : evalStmt FE EE1 (ifThenElse C (assign X T) (assign X F)) EE3 O4 Ev4 : O1 ++ O4 = O2 ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Variables: Names FE EE V EE' O Ctx X F T C N EE3 O2 Scope O3 O1 O4 EE4 Scope1 V1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE) EE IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev3 : evalStmt FE (((X, V1)::Scope1)::EE4) (ifThenElse C (assign X T) (assign X F)) EE3 O4 Ev4 : O1 ++ O4 = O2 Ev : evalExpr FE ([]::EE) (num 0) V1 (Scope1::EE4) O1 ============================ exists EE'', evalExpr FE EE (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< case Ev. Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 O4 EE4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev3 : evalStmt FE ([(X, intVal 0)]::EE4) (ifThenElse C (assign X T) (assign X F)) EE3 O4 Ev4 : [] ++ O4 = O2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< case Ev4. Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev3 : evalStmt FE ([(X, intVal 0)]::EE4) (ifThenElse C (assign X T) (assign X F)) EE3 O2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev3. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X T) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< EvC: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ Ctxs EN Ev NNS. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X T) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X T) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ EvC. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X T) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev EvC NNS. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X T) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_ctx_names to _ _ _ _ Ctxs EN EvC. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X T) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev3. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< LenEE_B': apply evalExpr_keep_scopes to _ _ _ EvC L. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< NNS2: assert newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B'. Subgoal 2.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B'
< NNS': case NNS'. Subgoal 2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 N2 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N2 EE2 EE_B' NNS'2 : take N2 EE2 [[(X, intVal 0)]] NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B'
< unfold . Subgoal 2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 N2 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N2 EE2 EE_B' NNS'2 : take N2 EE2 [[(X, intVal 0)]] NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::EE2) EE_B') /\ take N1 ([]::EE2) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< Take: case NNS'2. Subgoal 2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 N2 SNames BNames N3 L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N2 ([(X, intVal 0)]::L) EE_B' NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : take N3 L [] ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< case Take1. Subgoal 2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 N2 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N2 ([(X, intVal 0)]::L) EE_B' NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = N2 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< compute Take. Subgoal 2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop 1 ([(X, intVal 0)]::L) EE_B' NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< Drop: case NNS'1. Subgoal 2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N4 = 1 Drop1 : drop N4 L EE_B' ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< apply drop_is_integer to Drop1. Subgoal 2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N4 = 1 Drop1 : drop N4 L EE_B' H7 : is_integer N4 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L EE_B' H7 : is_integer 0 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< Drop: case Drop1. Subgoal 2.1.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::EE_B')) EE_B') /\ take N1 ([]::([(X, intVal 0)]::EE_B')) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< exists 2, [X], BNames. Subgoal 2.1.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ ((((length EE_B' N /\ drop 2 ([]::([(X, intVal 0)]::EE_B')) EE_B') /\ take 2 ([]::([(X, intVal 0)]::EE_B')) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] [X]) /\ names EE_B' BNames) /\ (forall X1, mem X1 [X] -> mem X1 BNames -> false)
< split. Subgoal 2.1.1.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ length EE_B' N
< search. Subgoal 2.1.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ drop 2 ([]::([(X, intVal 0)]::EE_B')) EE_B'
< search. Subgoal 2.1.1.1.3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ take 2 ([]::([(X, intVal 0)]::EE_B')) [[], [(X, intVal 0)]]
< search. Subgoal 2.1.1.1.4: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ names [[], [(X, intVal 0)]] [X]
< search. Subgoal 2.1.1.1.5: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ names EE_B' BNames
< search. Subgoal 2.1.1.1.6: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ forall X1, mem X1 [X] -> mem X1 BNames -> false
< intros MX MB. Subgoal 2.1.1.1.6: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MX : mem X1 [X] MB : mem X1 BNames ============================ false
< MX: case MX. Subgoal 2.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames ============================ false
< N: case NNS'3. Subgoal 2.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames NScope NRest Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N : domain [(X, intVal 0)] NScope N1 : names [] NRest N2 : NScope ++ NRest = SNames ============================ false
< case N1. Subgoal 2.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames NScope Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N : domain [(X, intVal 0)] NScope N2 : NScope ++ [] = SNames ============================ false
< D: case N. Subgoal 2.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames DRest Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N2 : X::DRest ++ [] = SNames D : domain [] DRest ============================ false
< case D. Subgoal 2.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N2 : [X] ++ [] = SNames ============================ false
< compute N2. Subgoal 2.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 [X] -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N2 : [X] ++ [] = [X] ============================ false
< backchain NNS'5. Subgoal 2.1.1.1.6.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X1 BNames MX : mem X1 [] ============================ false
< case MX. Subgoal 2.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames N5 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + N5 = 0 Drop2 : drop N5 L1 EE_B' ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< GEq: apply drop_geq_0 to Drop2. Subgoal 2.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames N5 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + N5 = 0 Drop2 : drop N5 L1 EE_B' GEq : N5 >= 0 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< P: assert 1 + -1 = 0. Subgoal 2.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames N5 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + N5 = 0 Drop2 : drop N5 L1 EE_B' GEq : N5 >= 0 P : 1 + -1 = 0 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< apply drop_is_integer to Drop2. Subgoal 2.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames N5 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + N5 = 0 Drop2 : drop N5 L1 EE_B' GEq : N5 >= 0 P : 1 + -1 = 0 H8 : is_integer N5 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< apply plus_integer_unique_addend to _ _ _ P Drop1. Subgoal 2.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE_B' GEq : -1 >= 0 P : 1 + -1 = 0 H8 : is_integer -1 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< LEq: case GEq. Subgoal 2.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE_B' P : 1 + -1 = 0 H8 : is_integer -1 LEq : 0 <= -1 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< case LEq. Subgoal 2.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length (S::BR) N NNS' : newNameScopes [[(X, intVal 0)]] N AR BR ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< LenBR: case LenEE_B'. Subgoal 2.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) NNS' : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< apply length_is to LenBR. Subgoal 2.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) NNS' : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 2.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) NNS' : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' LEq : N <= N' ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< L': apply lt_plus_one to LenBR1 _. Subgoal 2.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) NNS' : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' LEq : N <= N' L' : N' < N ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< apply less_lesseq_flip_false to L' LEq. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< CN: apply evalExpr_ctx_names to _ _ _ _ _ EN EvC. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< EvT: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ EN1 Ev3 NNS2. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_newNameScopes_output to _ _ _ _ Ev EvC _. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_newNameScopes_output to _ _ _ _ Ev3 EvT _. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_newNameScopes to _ _ _ _ Ev3 EvT _. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< EvN: case Ev1. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N O2 Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev2 : O2 ++ [] = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply append_nil_right to Ev2. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev2 : O ++ [] = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< clear Ev2. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< Eq: assert V = V2. Subgoal 2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V ============================ V = V2
< NNS-: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev3 EvT _. Subgoal 2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N EE5 EE_B'1 ============================ V = V2
< NNS-: case NNS-. Subgoal 2.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 N2 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 EE5 EE_B'1 NNS-2 : take N2 EE5 [[], [(X, intVal 0)]] NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ V = V2
< Take: case NNS-2. Subgoal 2.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::L) O6 Ev5 : replaceScopes X V2 ([]::L) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::L) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : take N3 L [[(X, intVal 0)]] ============================ V = V2
< Take: case Take1. Subgoal 2.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 N4 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : 1 + N4 = N3 Take2 : take N4 L1 [] ============================ V = V2
< case Take2. Subgoal 2.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : 1 + 0 = N3 ============================ V = V2
< compute Take1. Subgoal 2.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = N2 Take1 : 1 + 0 = 1 ============================ V = V2
< compute Take. Subgoal 2.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 ============================ V = V2
< RS: case Ev5. Subgoal 2.2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : mem (X, I) [] RS1 : remove_all [] X LRemain ============================ V = V2
< case RS. Subgoal 2.2.1.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : replaceScopes X V2 ([(X, intVal 0)]::L1) (Scope::EE') ============================ V = V2
< RS: case RS1. Subgoal 2.2.1.2.1: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (((X, V2)::LRemain)::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain ============================ V = V2
< LS: case EvN. Subgoal 2.2.1.2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain LS : lookup ((X, V2)::LRemain) X V ============================ V = V2
< E: case LS. Subgoal 2.2.1.2.1.1.1: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain ============================ V = V
< search. Subgoal 2.2.1.2.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain E : X = X -> false E1 : lookup LRemain X V ============================ V = V2
< apply E to _. Subgoal 2.2.1.2.1.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain LS : no_lookup ((X, V2)::LRemain) X LS1 : lookupScopes X EE' V ============================ V = V2
< E: case LS. Subgoal 2.2.1.2.1.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain LS1 : lookupScopes X EE' V E : X = X -> false E1 : no_lookup LRemain X ============================ V = V2
< apply E to _. Subgoal 2.2.1.2.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : no_lookup [(X, intVal 0)] X RS2 : replaceScopes X V2 L1 EE' ============================ V = V2
< E: case RS1. Subgoal 2.2.1.2.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS2 : replaceScopes X V2 L1 EE' E : X = X -> false E1 : no_lookup [] X ============================ V = V2
< apply E to _. Subgoal 2.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR ============================ V = V2
< LenBR+: apply evalExpr_keep_scopes to _ _ _ EvT LenEE_B'. Subgoal 2.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR+ : length (S::BR) N ============================ V = V2
< LenBR: case LenBR+. Subgoal 2.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ V = V2
< apply length_is to LenBR. Subgoal 2.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' ============================ V = V2
< L': apply lt_plus_one to LenBR1 _. Subgoal 2.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' L' : N' < N ============================ V = V2
< LEq: apply newNameScopes_length to NNS- LenBR. Subgoal 2.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' L' : N' < N LEq : N <= N' ============================ V = V2
< apply less_lesseq_flip_false to L' LEq. Subgoal 2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V Eq : V = V2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V2 EE'' O /\ scopes_same EE' EE''
< exists EE_B'1. Subgoal 2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 ============================ evalExpr FE EE4 (condExpr C T F) V2 EE_B'1 O /\ scopes_same EE' EE_B'1
< split. Subgoal 2.3: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 ============================ evalExpr FE EE4 (condExpr C T F) V2 EE_B'1 O
< search. Subgoal 2.4: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 ============================ scopes_same EE' EE_B'1
< NNS-: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev3 EvT _. Subgoal 2.4: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N EE5 EE_B'1 ============================ scopes_same EE' EE_B'1
< NNS-: case NNS-. Subgoal 2.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 N2 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 EE5 EE_B'1 NNS-2 : take N2 EE5 [[], [(X, intVal 0)]] NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ scopes_same EE' EE_B'1
< Take: case NNS-2. Subgoal 2.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::L) O6 Ev5 : replaceScopes X V2 ([]::L) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::L) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : take N3 L [[(X, intVal 0)]] ============================ scopes_same EE' EE_B'1
< Take: case Take1. Subgoal 2.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 N4 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : 1 + N4 = N3 Take2 : take N4 L1 [] ============================ scopes_same EE' EE_B'1
< case Take2. Subgoal 2.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : 1 + 0 = N3 ============================ scopes_same EE' EE_B'1
< compute Take1. Subgoal 2.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = N2 Take1 : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< compute Take. Subgoal 2.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< Drop: case NNS-1. Subgoal 2.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + N5 = 2 Drop1 : drop N5 ([(X, intVal 0)]::L1) EE_B'1 ============================ scopes_same EE' EE_B'1
< Drop: case Drop1. Subgoal 2.4.1.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 ([(X, intVal 0)]::L1) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length ([(X, intVal 0)]::L1) N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names ([(X, intVal 0)]::L1) BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 0 = 2 ============================ scopes_same EE' ([(X, intVal 0)]::L1)
< apply plus_integer_unique to Take1 Drop. Subgoal 2.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N5 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + N5 = 2 Drop1 : 1 + N6 = N5 Drop2 : drop N6 L1 EE_B'1 ============================ scopes_same EE' EE_B'1
< apply drop_is_integer to Drop2. Subgoal 2.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N5 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + N5 = 2 Drop1 : 1 + N6 = N5 Drop2 : drop N6 L1 EE_B'1 H7 : is_integer N6 ============================ scopes_same EE' EE_B'1
< apply plus_integer_is_integer to _ _ Drop1. Subgoal 2.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N5 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + N5 = 2 Drop1 : 1 + N6 = N5 Drop2 : drop N6 L1 EE_B'1 H7 : is_integer N6 H8 : is_integer N5 ============================ scopes_same EE' EE_B'1
< apply plus_integer_unique_addend to _ _ _ Drop Take. Subgoal 2.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + N6 = 1 Drop2 : drop N6 L1 EE_B'1 H7 : is_integer N6 H8 : is_integer 1 ============================ scopes_same EE' EE_B'1
< P: assert 1 + 0 = 1. Subgoal 2.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + N6 = 1 Drop2 : drop N6 L1 EE_B'1 H7 : is_integer N6 H8 : is_integer 1 P : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< apply plus_integer_unique_addend to _ _ _ P Drop1. Subgoal 2.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 L1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< Drop: case Drop2 (keep). Subgoal 2.4.1.2.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE_B'1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::EE_B'1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE_B'1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< RS: case Ev5. Subgoal 2.4.1.2.1.1: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE' O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V2 NNS- : length EE' N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE' BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE' EE' H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : mem (X, I) [] RS1 : remove_all [] X LRemain ============================ scopes_same EE' EE'
< case RS. Subgoal 2.4.1.2.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE_B'1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE_B'1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS1 : replaceScopes X V2 ([(X, intVal 0)]::EE_B'1) (Scope::EE') ============================ scopes_same EE' EE_B'1
< RS: case RS1. Subgoal 2.4.1.2.1.2.1: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE' O6 EvN : lookupScopes X (((X, V2)::LRemain)::EE') V2 NNS- : length EE' N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE' BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE' EE' H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain ============================ scopes_same EE' EE'
< apply evalExpr_isCtx to _ _ _ EvT. Subgoal 2.4.1.2.1.2.1: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE' O6 EvN : lookupScopes X (((X, V2)::LRemain)::EE') V2 NNS- : length EE' N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE' BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE' EE' H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain H9 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Subgoal 2.4.1.2.1.2.2: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE_B'1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE_B'1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS1 : no_lookup [(X, intVal 0)] X RS2 : replaceScopes X V2 EE_B'1 EE' ============================ scopes_same EE' EE_B'1
< E: case RS1. Subgoal 2.4.1.2.1.2.2: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::EE_B'1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE_B'1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS2 : replaceScopes X V2 EE_B'1 EE' E : X = X -> false E1 : no_lookup [] X ============================ scopes_same EE' EE_B'1
< apply E to _. Subgoal 2.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames N9 L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + N9 = 0 Drop4 : drop N9 L2 EE_B'1 ============================ scopes_same EE' EE_B'1
< apply drop_is_integer to Drop4. Subgoal 2.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames N9 L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + N9 = 0 Drop4 : drop N9 L2 EE_B'1 H9 : is_integer N9 ============================ scopes_same EE' EE_B'1
< P': assert 1 + -1 = 0. Subgoal 2.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames N9 L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + N9 = 0 Drop4 : drop N9 L2 EE_B'1 H9 : is_integer N9 P' : 1 + -1 = 0 ============================ scopes_same EE' EE_B'1
< apply plus_integer_unique_addend to _ _ _ P' Drop3. Subgoal 2.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + -1 = 0 Drop4 : drop -1 L2 EE_B'1 H9 : is_integer -1 P' : 1 + -1 = 0 ============================ scopes_same EE' EE_B'1
< GE: apply drop_geq_0 to Drop4. Subgoal 2.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + -1 = 0 Drop4 : drop -1 L2 EE_B'1 H9 : is_integer -1 P' : 1 + -1 = 0 GE : -1 >= 0 ============================ scopes_same EE' EE_B'1
< LE: case GE. Subgoal 2.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + -1 = 0 Drop4 : drop -1 L2 EE_B'1 H9 : is_integer -1 P' : 1 + -1 = 0 LE : 0 <= -1 ============================ scopes_same EE' EE_B'1
< case LE. Subgoal 2.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR ============================ scopes_same EE' (S::BR)
< LenBR+: apply evalExpr_keep_scopes to _ _ _ EvT LenEE_B'. Subgoal 2.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR+ : length (S::BR) N ============================ scopes_same EE' (S::BR)
< LenBR: case LenBR+. Subgoal 2.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ scopes_same EE' (S::BR)
< apply length_is to LenBR. Subgoal 2.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' ============================ scopes_same EE' (S::BR)
< L': apply lt_plus_one to LenBR1 _. Subgoal 2.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' L' : N' < N ============================ scopes_same EE' (S::BR)
< LEq: apply newNameScopes_length to NNS- LenBR. Subgoal 2.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C trueVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C trueVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) T V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvT : evalExpr FE EE_B' T V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' L' : N' < N LEq : N <= N' ============================ scopes_same EE' (S::BR)
< apply less_lesseq_flip_false to L' LEq. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X F) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< EvC: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ Ctxs EN Ev NNS. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X F) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X F) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isCtx to _ _ _ EvC. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X F) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev EvC NNS. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X F) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_ctx_names to _ _ _ _ Ctxs EN EvC. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev3 : evalStmt FE ([]::EE2) (assign X F) (Scope2::EE3) O6 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev3. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< LenEE_B': apply evalExpr_keep_scopes to _ _ _ EvC L. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< NNS2: assert newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B'. Subgoal 3.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B'
< NNS': case NNS'. Subgoal 3.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 N2 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N2 EE2 EE_B' NNS'2 : take N2 EE2 [[(X, intVal 0)]] NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B'
< unfold . Subgoal 3.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 N2 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N2 EE2 EE_B' NNS'2 : take N2 EE2 [[(X, intVal 0)]] NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::EE2) EE_B') /\ take N1 ([]::EE2) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< Take: case NNS'2. Subgoal 3.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 N2 SNames BNames N3 L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N2 ([(X, intVal 0)]::L) EE_B' NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : take N3 L [] ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< case Take1. Subgoal 3.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 N2 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop N2 ([(X, intVal 0)]::L) EE_B' NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = N2 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< compute Take. Subgoal 3.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'1 : drop 1 ([(X, intVal 0)]::L) EE_B' NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< Drop: case NNS'1. Subgoal 3.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N4 = 1 Drop1 : drop N4 L EE_B' ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< apply drop_is_integer to Drop1. Subgoal 3.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L N4 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N4 = 1 Drop1 : drop N4 L EE_B' H7 : is_integer N4 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 3.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::L) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::L) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::L)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L EE_B' H7 : is_integer 0 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::L)) EE_B') /\ take N1 ([]::([(X, intVal 0)]::L)) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< Drop: case Drop1. Subgoal 3.1.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::EE_B')) EE_B') /\ take N1 ([]::([(X, intVal 0)]::EE_B')) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< exists 2, [X], BNames. Subgoal 3.1.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ ((((length EE_B' N /\ drop 2 ([]::([(X, intVal 0)]::EE_B')) EE_B') /\ take 2 ([]::([(X, intVal 0)]::EE_B')) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] [X]) /\ names EE_B' BNames) /\ (forall X1, mem X1 [X] -> mem X1 BNames -> false)
< split. Subgoal 3.1.1.1.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ length EE_B' N
< search. Subgoal 3.1.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ drop 2 ([]::([(X, intVal 0)]::EE_B')) EE_B'
< search. Subgoal 3.1.1.1.3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ take 2 ([]::([(X, intVal 0)]::EE_B')) [[], [(X, intVal 0)]]
< search. Subgoal 3.1.1.1.4: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ names [[], [(X, intVal 0)]] [X]
< search. Subgoal 3.1.1.1.5: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ names EE_B' BNames
< search. Subgoal 3.1.1.1.6: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 ============================ forall X1, mem X1 [X] -> mem X1 BNames -> false
< intros MX MB. Subgoal 3.1.1.1.6: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MX : mem X1 [X] MB : mem X1 BNames ============================ false
< MX: case MX. Subgoal 3.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames ============================ false
< N: case NNS'3. Subgoal 3.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames NScope NRest Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N : domain [(X, intVal 0)] NScope N1 : names [] NRest N2 : NScope ++ NRest = SNames ============================ false
< case N1. Subgoal 3.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames NScope Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N : domain [(X, intVal 0)] NScope N2 : NScope ++ [] = SNames ============================ false
< D: case N. Subgoal 3.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames DRest Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N2 : X::DRest ++ [] = SNames D : domain [] DRest ============================ false
< case D. Subgoal 3.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N2 : [X] ++ [] = SNames ============================ false
< compute N2. Subgoal 3.1.1.1.6.1: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 [X] -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X BNames N2 : [X] ++ [] = [X] ============================ false
< backchain NNS'5. Subgoal 3.1.1.1.6.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::EE_B') O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE_B') H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::EE_B')) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 MB : mem X1 BNames MX : mem X1 [] ============================ false
< case MX. Subgoal 3.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames N5 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + N5 = 0 Drop2 : drop N5 L1 EE_B' ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< GEq: apply drop_geq_0 to Drop2. Subgoal 3.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames N5 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + N5 = 0 Drop2 : drop N5 L1 EE_B' GEq : N5 >= 0 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< P: assert 1 + -1 = 0. Subgoal 3.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames N5 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + N5 = 0 Drop2 : drop N5 L1 EE_B' GEq : N5 >= 0 P : 1 + -1 = 0 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< apply drop_is_integer to Drop2. Subgoal 3.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames N5 L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + N5 = 0 Drop2 : drop N5 L1 EE_B' GEq : N5 >= 0 P : 1 + -1 = 0 H8 : is_integer N5 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< apply plus_integer_unique_addend to _ _ _ P Drop1. Subgoal 3.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE_B' GEq : -1 >= 0 P : 1 + -1 = 0 H8 : is_integer -1 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< LEq: case GEq. Subgoal 3.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 EE_B' V2 EE5 SNames BNames L1 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal ([(X, intVal 0)]::(X1::L1)) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::(X1::L1)) H5 : is_list (is_list (is_pair is_string is_value)) EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::([(X, intVal 0)]::(X1::L1))) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS' : length EE_B' N NNS'3 : names [[(X, intVal 0)]] SNames NNS'4 : names EE_B' BNames NNS'5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H7 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE_B' P : 1 + -1 = 0 H8 : is_integer -1 LEq : 0 <= -1 ============================ exists N1 SNames BNames, ((((length EE_B' N /\ drop N1 ([]::([(X, intVal 0)]::(X1::L1))) EE_B') /\ take N1 ([]::([(X, intVal 0)]::(X1::L1))) [[], [(X, intVal 0)]]) /\ names [[], [(X, intVal 0)]] SNames) /\ names EE_B' BNames) /\ (forall X2, mem X2 SNames -> mem X2 BNames -> false)
< case LEq. Subgoal 3.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length (S::BR) N NNS' : newNameScopes [[(X, intVal 0)]] N AR BR ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< LenBR: case LenEE_B'. Subgoal 3.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) NNS' : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< apply length_is to LenBR. Subgoal 3.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) NNS' : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< LEq: apply newNameScopes_length to NNS' LenBR. Subgoal 3.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) NNS' : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' LEq : N <= N' ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< L': apply lt_plus_one to LenBR1 _. Subgoal 3.1.2: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 O5 Scope2 O6 V2 EE5 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal (S::AR) O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal (S::BR) O5 H4 : is_list (is_list (is_pair is_string is_value)) (S::AR) H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : ctx_names (S::BR) Ctx Ev3 : evalExpr FE ([]::(S::AR)) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) NNS' : newNameScopes [[(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' LEq : N <= N' L' : N' < N ============================ newNameScopes [[], [(X, intVal 0)]] N ([]::(S::AR)) (S::BR)
< apply less_lesseq_flip_false to L' LEq. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< CN: apply evalExpr_ctx_names to _ _ _ _ _ EN EvC. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< EvF: apply evalExpr_newNameScopes_exists_back to _ _ _ _ _ _ EN2 Ev3 NNS2. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_newNameScopes_output to _ _ _ _ Ev EvC _. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_newNameScopes_output to _ _ _ _ Ev3 EvF _. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply evalExpr_newNameScopes to _ _ _ _ Ev3 EvF _. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N EE3 O2 Scope O3 EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev1 : evalExpr FE EE3 (name X) V (Scope::EE') O3 Ev2 : O2 ++ O3 = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::EE3) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< EvN: case Ev1. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N O2 Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev2 : O2 ++ [] = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O2 EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< apply append_nil_right to Ev2. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev2 : O ++ [] = O Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< clear Ev2. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< Eq: assert V = V2. Subgoal 3.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V ============================ V = V2
< NNS-: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev3 EvF _. Subgoal 3.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N EE5 EE_B'1 ============================ V = V2
< NNS-: case NNS-. Subgoal 3.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 N2 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 EE5 EE_B'1 NNS-2 : take N2 EE5 [[], [(X, intVal 0)]] NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ V = V2
< Take: case NNS-2. Subgoal 3.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::L) O6 Ev5 : replaceScopes X V2 ([]::L) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::L) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : take N3 L [[(X, intVal 0)]] ============================ V = V2
< Take: case Take1. Subgoal 3.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 N4 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : 1 + N4 = N3 Take2 : take N4 L1 [] ============================ V = V2
< case Take2. Subgoal 3.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : 1 + 0 = N3 ============================ V = V2
< compute Take1. Subgoal 3.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = N2 Take1 : 1 + 0 = 1 ============================ V = V2
< compute Take. Subgoal 3.2.1: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 ============================ V = V2
< RS: case Ev5. Subgoal 3.2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : mem (X, I) [] RS1 : remove_all [] X LRemain ============================ V = V2
< case RS. Subgoal 3.2.1.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : replaceScopes X V2 ([(X, intVal 0)]::L1) (Scope::EE') ============================ V = V2
< RS: case RS1. Subgoal 3.2.1.2.1: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (((X, V2)::LRemain)::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain ============================ V = V2
< LS: case EvN. Subgoal 3.2.1.2.1.1: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain LS : lookup ((X, V2)::LRemain) X V ============================ V = V2
< E: case LS. Subgoal 3.2.1.2.1.1.1: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain ============================ V = V
< search. Subgoal 3.2.1.2.1.1.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain E : X = X -> false E1 : lookup LRemain X V ============================ V = V2
< apply E to _. Subgoal 3.2.1.2.1.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain LS : no_lookup ((X, V2)::LRemain) X LS1 : lookupScopes X EE' V ============================ V = V2
< E: case LS. Subgoal 3.2.1.2.1.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain LS1 : lookupScopes X EE' V E : X = X -> false E1 : no_lookup LRemain X ============================ V = V2
< apply E to _. Subgoal 3.2.1.2.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS1 : no_lookup [(X, intVal 0)] X RS2 : replaceScopes X V2 L1 EE' ============================ V = V2
< E: case RS1. Subgoal 3.2.1.2.2: Variables: Names FE V EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 RS : no_lookup [] X RS2 : replaceScopes X V2 L1 EE' E : X = X -> false E1 : no_lookup [] X ============================ V = V2
< apply E to _. Subgoal 3.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR ============================ V = V2
< LenBR+: apply evalExpr_keep_scopes to _ _ _ EvF LenEE_B'. Subgoal 3.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR+ : length (S::BR) N ============================ V = V2
< LenBR: case LenBR+. Subgoal 3.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ V = V2
< apply length_is to LenBR. Subgoal 3.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' ============================ V = V2
< L': apply lt_plus_one to LenBR1 _. Subgoal 3.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' L' : N' < N ============================ V = V2
< LEq: apply newNameScopes_length to NNS- LenBR. Subgoal 3.2.2: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' L' : N' < N LEq : N <= N' ============================ V = V2
< apply less_lesseq_flip_false to L' LEq. Subgoal 3: Variables: Names FE V EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V Eq : V = V2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V EE'' O /\ scopes_same EE' EE''
< case Eq. Subgoal 3: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 ============================ exists EE'', evalExpr FE EE4 (condExpr C T F) V2 EE'' O /\ scopes_same EE' EE''
< exists EE_B'1. Subgoal 3: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 ============================ evalExpr FE EE4 (condExpr C T F) V2 EE_B'1 O /\ scopes_same EE' EE_B'1
< split. Subgoal 3.3: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 ============================ evalExpr FE EE4 (condExpr C T F) V2 EE_B'1 O
< search. Subgoal 3.4: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 ============================ scopes_same EE' EE_B'1
< NNS-: apply evalExpr_newNameScopes_ctx to _ _ _ _ Ev3 EvF _. Subgoal 3.4: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N EE5 EE_B'1 ============================ scopes_same EE' EE_B'1
< NNS-: case NNS-. Subgoal 3.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE5 EE_B'1 N2 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 EE5 O6 Ev5 : replaceScopes X V2 EE5 (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 EE5 EE_B'1 NNS-2 : take N2 EE5 [[], [(X, intVal 0)]] NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ scopes_same EE' EE_B'1
< Take: case NNS-2. Subgoal 3.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 L Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::L) O6 Ev5 : replaceScopes X V2 ([]::L) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::L) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : take N3 L [[(X, intVal 0)]] ============================ scopes_same EE' EE_B'1
< Take: case Take1. Subgoal 3.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 N4 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : 1 + N4 = N3 Take2 : take N4 L1 [] ============================ scopes_same EE' EE_B'1
< case Take2. Subgoal 3.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames N3 L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N3 = N2 Take1 : 1 + 0 = N3 ============================ scopes_same EE' EE_B'1
< compute Take1. Subgoal 3.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 N2 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop N2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = N2 Take1 : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< compute Take. Subgoal 3.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-1 : drop 2 ([]::([(X, intVal 0)]::L1)) EE_B'1 NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< Drop: case NNS-1. Subgoal 3.4.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N5 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + N5 = 2 Drop1 : drop N5 ([(X, intVal 0)]::L1) EE_B'1 ============================ scopes_same EE' EE_B'1
< Drop: case Drop1. Subgoal 3.4.1.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 ([(X, intVal 0)]::L1) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length ([(X, intVal 0)]::L1) N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names ([(X, intVal 0)]::L1) BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 0 = 2 ============================ scopes_same EE' ([(X, intVal 0)]::L1)
< apply plus_integer_unique to Take1 Drop. Subgoal 3.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N5 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + N5 = 2 Drop1 : 1 + N6 = N5 Drop2 : drop N6 L1 EE_B'1 ============================ scopes_same EE' EE_B'1
< apply drop_is_integer to Drop2. Subgoal 3.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N5 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + N5 = 2 Drop1 : 1 + N6 = N5 Drop2 : drop N6 L1 EE_B'1 H7 : is_integer N6 ============================ scopes_same EE' EE_B'1
< apply plus_integer_is_integer to _ _ Drop1. Subgoal 3.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N5 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + N5 = 2 Drop1 : 1 + N6 = N5 Drop2 : drop N6 L1 EE_B'1 H7 : is_integer N6 H8 : is_integer N5 ============================ scopes_same EE' EE_B'1
< apply plus_integer_unique_addend to _ _ _ Drop Take. Subgoal 3.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + N6 = 1 Drop2 : drop N6 L1 EE_B'1 H7 : is_integer N6 H8 : is_integer 1 ============================ scopes_same EE' EE_B'1
< P: assert 1 + 0 = 1. Subgoal 3.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 N6 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + N6 = 1 Drop2 : drop N6 L1 EE_B'1 H7 : is_integer N6 H8 : is_integer 1 P : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< apply plus_integer_unique_addend to _ _ _ P Drop1. Subgoal 3.4.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::L1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::L1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 L1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< Drop: case Drop2 (keep). Subgoal 3.4.1.2.1: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE_B'1)) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::EE_B'1)) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE_B'1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 ============================ scopes_same EE' EE_B'1
< RS: case Ev5. Subgoal 3.4.1.2.1.1: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE' O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V2 NNS- : length EE' N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE' BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE' EE' H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : mem (X, I) [] RS1 : remove_all [] X LRemain ============================ scopes_same EE' EE'
< case RS. Subgoal 3.4.1.2.1.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE_B'1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE_B'1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS1 : replaceScopes X V2 ([(X, intVal 0)]::EE_B'1) (Scope::EE') ============================ scopes_same EE' EE_B'1
< RS: case RS1. Subgoal 3.4.1.2.1.2.1: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE' O6 EvN : lookupScopes X (((X, V2)::LRemain)::EE') V2 NNS- : length EE' N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE' BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE' EE' H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain ============================ scopes_same EE' EE'
< apply evalExpr_isCtx to _ _ _ EvF. Subgoal 3.4.1.2.1.2.1: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 SNames BNames I LRemain Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE')) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE' O6 EvN : lookupScopes X (((X, V2)::LRemain)::EE') V2 NNS- : length EE' N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE' BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE' EE' H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS1 : mem (X, I) [(X, intVal 0)] RS2 : remove_all [(X, intVal 0)] X LRemain H9 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Subgoal 3.4.1.2.1.2.2: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE_B'1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE_B'1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS1 : no_lookup [(X, intVal 0)] X RS2 : replaceScopes X V2 EE_B'1 EE' ============================ scopes_same EE' EE_B'1
< E: case RS1. Subgoal 3.4.1.2.1.2.2: Variables: Names FE EE' O Ctx X F T C N EE4 EE2 O5 O6 EE_B' V2 EE_B'1 SNames BNames Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::EE_B'1)) O6 LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X ([(X, intVal 0)]::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 EE_B'1 EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 RS : no_lookup [] X RS2 : replaceScopes X V2 EE_B'1 EE' E : X = X -> false E1 : no_lookup [] X ============================ scopes_same EE' EE_B'1
< apply E to _. Subgoal 3.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames N9 L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + N9 = 0 Drop4 : drop N9 L2 EE_B'1 ============================ scopes_same EE' EE_B'1
< apply drop_is_integer to Drop4. Subgoal 3.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames N9 L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + N9 = 0 Drop4 : drop N9 L2 EE_B'1 H9 : is_integer N9 ============================ scopes_same EE' EE_B'1
< P': assert 1 + -1 = 0. Subgoal 3.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames N9 L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + N9 = 0 Drop4 : drop N9 L2 EE_B'1 H9 : is_integer N9 P' : 1 + -1 = 0 ============================ scopes_same EE' EE_B'1
< apply plus_integer_unique_addend to _ _ _ P' Drop3. Subgoal 3.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + -1 = 0 Drop4 : drop -1 L2 EE_B'1 H9 : is_integer -1 P' : 1 + -1 = 0 ============================ scopes_same EE' EE_B'1
< GE: apply drop_geq_0 to Drop4. Subgoal 3.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + -1 = 0 Drop4 : drop -1 L2 EE_B'1 H9 : is_integer -1 P' : 1 + -1 = 0 GE : -1 >= 0 ============================ scopes_same EE' EE_B'1
< LE: case GE. Subgoal 3.4.1.2.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 EE_B'1 SNames BNames L2 X1 Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 ([]::([(X, intVal 0)]::(X1::L2))) O6 Ev5 : replaceScopes X V2 ([]::([(X, intVal 0)]::(X1::L2))) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 EE_B'1 O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : length EE_B'1 N NNS-3 : names [[], [(X, intVal 0)]] SNames NNS-4 : names EE_B'1 BNames NNS-5 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 1 = 2 Take1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : 1 + 0 = 1 Drop2 : drop 0 (X1::L2) EE_B'1 H7 : is_integer 0 H8 : is_integer 1 P : 1 + 0 = 1 Drop3 : 1 + -1 = 0 Drop4 : drop -1 L2 EE_B'1 H9 : is_integer -1 P' : 1 + -1 = 0 LE : 0 <= -1 ============================ scopes_same EE' EE_B'1
< case LE. Subgoal 3.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR ============================ scopes_same EE' (S::BR)
< LenBR+: apply evalExpr_keep_scopes to _ _ _ EvF LenEE_B'. Subgoal 3.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR+ : length (S::BR) N ============================ scopes_same EE' (S::BR)
< LenBR: case LenBR+. Subgoal 3.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N ============================ scopes_same EE' (S::BR)
< apply length_is to LenBR. Subgoal 3.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' ============================ scopes_same EE' (S::BR)
< L': apply lt_plus_one to LenBR1 _. Subgoal 3.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' L' : N' < N ============================ scopes_same EE' (S::BR)
< LEq: apply newNameScopes_length to NNS- LenBR. Subgoal 3.4.2: Variables: Names FE EE' O Ctx X F T C N Scope EE4 EE2 O5 Scope2 O6 EE_B' V2 BR S AR N' Pr : Names |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) Names : names EE4 Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE4 IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE4 Ctx Pr1 : fresh_name "X" Names X H1 : is_expr C H2 : is_expr T H3 : is_expr F EN : exprNames Ctx C [] EN1 : exprNames Ctx T [] EN2 : exprNames Ctx F [] L : length EE4 N NNS : newNameScopes [[(X, intVal 0)]] N ([(X, intVal 0)]::EE4) EE4 IsX : is_string X Ev : evalExpr FE ([(X, intVal 0)]::EE4) C falseVal EE2 O5 Ev4 : O5 ++ O6 = O EvC : evalExpr FE EE4 C falseVal EE_B' O5 H4 : is_list (is_list (is_pair is_string is_value)) EE2 H5 : is_list (is_list (is_pair is_string is_value)) EE_B' NNS' : newNameScopes [[(X, intVal 0)]] N EE2 EE_B' H6 : ctx_names EE_B' Ctx Ev3 : evalExpr FE ([]::EE2) F V2 (S::AR) O6 Ev5 : replaceScopes X V2 (S::AR) (Scope2::(Scope::EE')) LenEE_B' : length EE_B' N NNS2 : newNameScopes [[], [(X, intVal 0)]] N ([]::EE2) EE_B' CN : ctx_names EE_B' Ctx EvF : evalExpr FE EE_B' F V2 (S::BR) O6 EvN : lookupScopes X (Scope::EE') V2 NNS- : newNameScopes [[], [(X, intVal 0)]] N AR BR LenBR : length BR N' LenBR1 : 1 + N' = N H7 : is_integer N' L' : N' < N LEq : N <= N' ============================ scopes_same EE' (S::BR)
< apply less_lesseq_flip_false to L' LEq. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_backward. Proof completed.
< Prove_Ext_Ind exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Names: apply names_exists to IsEE. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE N1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< rename N1 to Nmes. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< IsNames: apply names_is to _ Names. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Fr: apply fresh_name_exists to _ IsNames with Base = "X". Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes F1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< rename F1 to X. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Proj: assert Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X). Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< IsN2: apply ext_size_is_int_evalExpr to R3. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< IsN3: apply ext_size_is_int_evalExpr to R4. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< PN2: apply ext_size_pos_evalExpr to R3. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< PN3: apply ext_size_pos_evalExpr to R4. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LEq2: apply lte_left to R2 _ _ _. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LEq3: apply lte_right to R2 _ _ _. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< P: apply plus_integer_is_integer to _ _ R2. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LN4: apply lt_plus_one to R1 _. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LEqN2: apply lesseq_less_integer_transitive to LEq2 LN4. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LEqN3: apply lesseq_less_integer_transitive to LEq3 LN4. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N LEqN3 : N3 < N ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Acc: case Acc. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 IsE : is_expr (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N LEqN3 : N3 < N Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< A2: apply Acc to _ LEqN2. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 IsE : is_expr (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N LEqN3 : N3 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< A3: apply Acc to _ LEqN3. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 IsE : is_expr (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N LEqN3 : N3 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * A3 : acc N3 * ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< clear Acc LEqN3 LEqN2 LN4 P LEq3 LEq2 PN3 PN2 IsN3 IsN2. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 IsE : is_expr (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< case IsE. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< unfold . Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ exists Names E_P V_P EE_P O_P EE1 O1 O2, (<evalExpr {P}> FE EE C trueVal EE1 O1 /\ (<evalExpr {P}> FE EE1 T V EE' O2 /\ O1 ++ O2 = O)) /\ (names EE Names /\ (Names |{expr}- condExpr C T F ~~> E_P /\ <evalExpr {P}> FE EE E_P V_P EE_P O_P))
< exists Nmes, stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X), V, EE', O, EE3, O2, O3. Subgoal 1.27: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ (<evalExpr {P}> FE EE C trueVal EE3 O2 /\ (<evalExpr {P}> FE EE3 T V EE' O3 /\ O2 ++ O3 = O)) /\ (names EE Nmes /\ (Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) /\ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O))
< split. Subgoal 1.27.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ <evalExpr {P}> FE EE C trueVal EE3 O2
< apply IH to R3 A2 _ _ _. Subgoal 1.27.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C trueVal EE3 O2 ============================ <evalExpr {P}> FE EE C trueVal EE3 O2
< search. Subgoal 1.27.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ <evalExpr {P}> FE EE3 T V EE' O3
< Ev1: apply drop_ext_size_evalExpr to R3. Subgoal 1.27.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F Ev1 : evalExpr FE EE C trueVal EE3 O2 ============================ <evalExpr {P}> FE EE3 T V EE' O3
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.27.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F Ev1 : evalExpr FE EE C trueVal EE3 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE3 T V EE' O3
< apply IH to R4 A3 _ _ _. Subgoal 1.27.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F Ev1 : evalExpr FE EE C trueVal EE3 O2 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : <evalExpr {P}> FE EE3 T V EE' O3 ============================ <evalExpr {P}> FE EE3 T V EE' O3
< search. Subgoal 1.27.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ O2 ++ O3 = O
< search. Subgoal 1.27.4: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ names EE Nmes
< search. Subgoal 1.27.5: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)
< search. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< L: apply length_exists_list_pair_string_value to IsEE. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE N1 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< rename N1 to Len. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< EvD: assert evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) []. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< NNS: assert newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE. Subgoal 1.27.6.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE
< unfold . Subgoal 1.27.6.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ exists N SNames BNames, ((((length EE Len /\ drop N ([(X, intVal 0)]::EE) EE) /\ take N ([(X, intVal 0)]::EE) [[(X, intVal 0)]]) /\ names [[(X, intVal 0)]] SNames) /\ names EE BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< exists 1, [X], Nmes. Subgoal 1.27.6.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ ((((length EE Len /\ drop 1 ([(X, intVal 0)]::EE) EE) /\ take 1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]) /\ names [[(X, intVal 0)]] [X]) /\ names EE Nmes) /\ (forall X1, mem X1 [X] -> mem X1 Nmes -> false)
< split. Subgoal 1.27.6.1.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ length EE Len
< search. Subgoal 1.27.6.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ drop 1 ([(X, intVal 0)]::EE) EE
< search. Subgoal 1.27.6.1.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ take 1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]
< search. Subgoal 1.27.6.1.4: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ names [[(X, intVal 0)]] [X]
< search. Subgoal 1.27.6.1.5: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ names EE Nmes
< search. Subgoal 1.27.6.1.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ forall X1, mem X1 [X] -> mem X1 Nmes -> false
< intros MX MN. Subgoal 1.27.6.1.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] MX : mem X1 [X] MN : mem X1 Nmes ============================ false
< MX: case MX. Subgoal 1.27.6.1.6.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] MN : mem X Nmes ============================ false
< apply fresh_name_not_mem to _ MN. Subgoal 1.27.6.1.6.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] MN : mem X1 Nmes MX : mem X1 [] ============================ false
< case MX. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< IsX: apply fresh_name_is to _ Fr. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< Ev: apply drop_ext_size_evalExpr to R3. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< Ev1: apply drop_ext_size_evalExpr to R4. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< assert is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)). Subgoal 1.27.6.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE))
< search 6. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< EvA_ES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R3 NNS. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 N2 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< EvA_P: apply IH to EvA_ES A2 _ _ _. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< EvA: apply drop_ext_size_evalExpr to EvA_ES. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA Ev _. Subgoal 1.27.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 NNS' : newNameScopes [[(X, intVal 0)]] Len EE_A' EE3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< NNS': case NNS' (keep). Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal EE_A' O2 NNS' : newNameScopes [[(X, intVal 0)]] Len EE_A' EE3 NNS'1 : length EE3 Len NNS'2 : drop N1 EE_A' EE3 NNS'3 : take N1 EE_A' [[(X, intVal 0)]] NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< Take: case NNS'3. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len N1 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop N1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N5 = N1 Take1 : take N5 L [] ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< case Take1. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop N1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = N1 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< compute Take. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< Eq: assert L = EE3. Subgoal 1.27.6.3.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ L = EE3
< Drop: case NNS'2. Subgoal 1.27.6.3.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop1 : drop N6 L EE3 ============================ L = EE3
< apply drop_is_integer to Drop1. Subgoal 1.27.6.3.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop1 : drop N6 L EE3 H6 : is_integer N6 ============================ L = EE3
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 1.27.6.3.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L EE3 H6 : is_integer 0 ============================ L = EE3
< Drop: case Drop1. Subgoal 1.27.6.3.1.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 ============================ EE3 = EE3
< search. Subgoal 1.27.6.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N7 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 Drop1 : 1 + N7 = 0 Drop2 : drop N7 L1 EE3 ============================ X1::L1 = EE3
< P: assert 1 + -1 = 0. Subgoal 1.27.6.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N7 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 Drop1 : 1 + N7 = 0 Drop2 : drop N7 L1 EE3 P : 1 + -1 = 0 ============================ X1::L1 = EE3
< apply drop_is_integer to Drop2. Subgoal 1.27.6.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N7 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 Drop1 : 1 + N7 = 0 Drop2 : drop N7 L1 EE3 P : 1 + -1 = 0 H7 : is_integer N7 ============================ X1::L1 = EE3
< apply plus_integer_unique_addend to _ _ _ Drop1 P. Subgoal 1.27.6.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H7 : is_integer -1 ============================ X1::L1 = EE3
< GEq: apply drop_geq_0 to Drop2. Subgoal 1.27.6.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H7 : is_integer -1 GEq : -1 >= 0 ============================ X1::L1 = EE3
< LEq: case GEq. Subgoal 1.27.6.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H6 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H7 : is_integer -1 LEq : 0 <= -1 ============================ X1::L1 = EE3
< case LEq. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Eq : L = EE3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< case Eq. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply evalExpr_isCtx to _ _ _ EvA. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< NNS'': assert newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< EvA2_ES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R4 NNS''. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 N3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< EvA2_P: apply IH to EvA2_ES A3 _ _ _. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< EvA2: apply drop_ext_size_evalExpr to EvA2_ES. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< NNS''': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA2 Ev1 _. Subgoal 1.27.6.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len EE_A'1 EE' ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< NNS''': case NNS'''. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames EE_A'1 N6 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V EE_A'1 O3 NNS''' : length EE' Len NNS'''1 : drop N6 EE_A'1 EE' NNS'''2 : take N6 EE_A'1 [[], [(X, intVal 0)]] NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< T: case NNS'''2. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N6 SNames1 BNames1 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::L1) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::L1) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::L1) O3 NNS''' : length EE' Len NNS'''1 : drop N6 ([]::L1) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N7 = N6 T1 : take N7 L1 [[(X, intVal 0)]] ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< T: case T1. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N6 SNames1 BNames1 N7 N9 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop N6 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N7 = N6 T1 : 1 + N9 = N7 T2 : take N9 L2 [] ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< case T2. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N6 SNames1 BNames1 N7 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop N6 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N7 = N6 T1 : 1 + 0 = N7 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< compute T1. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N6 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop N6 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = N6 T1 : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< compute T. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< Eq: assert L2 = EE'. Subgoal 1.27.6.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ L2 = EE'
< Drop: case NNS'''1. Subgoal 1.27.6.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 L2 N10 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + N10 = 2 Drop1 : drop N10 ([(X, intVal 0)]::L2) EE' ============================ L2 = EE'
< apply drop_is_integer to Drop1. Subgoal 1.27.6.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 L2 N10 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + N10 = 2 Drop1 : drop N10 ([(X, intVal 0)]::L2) EE' H7 : is_integer N10 ============================ L2 = EE'
< apply plus_integer_unique_addend to _ _ _ T Drop. Subgoal 1.27.6.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : drop 1 ([(X, intVal 0)]::L2) EE' H7 : is_integer 1 ============================ L2 = EE'
< Drop: case Drop1. Subgoal 1.27.6.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 L2 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + N11 = 1 Drop2 : drop N11 L2 EE' ============================ L2 = EE'
< apply drop_is_integer to Drop2. Subgoal 1.27.6.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 L2 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + N11 = 1 Drop2 : drop N11 L2 EE' H8 : is_integer N11 ============================ L2 = EE'
< apply plus_integer_unique_addend to _ _ _ T1 Drop1. Subgoal 1.27.6.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + 0 = 1 Drop2 : drop 0 L2 EE' H8 : is_integer 0 ============================ L2 = EE'
< Drop: case Drop2. Subgoal 1.27.6.3.2.1.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + 0 = 1 H8 : is_integer 0 ============================ EE' = EE'
< search. Subgoal 1.27.6.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 N14 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + 0 = 1 H8 : is_integer 0 Drop2 : 1 + N14 = 0 Drop3 : drop N14 L3 EE' ============================ X1::L3 = EE'
< P: assert 1 + -1 = 0. Subgoal 1.27.6.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 N14 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + 0 = 1 H8 : is_integer 0 Drop2 : 1 + N14 = 0 Drop3 : drop N14 L3 EE' P : 1 + -1 = 0 ============================ X1::L3 = EE'
< apply drop_is_integer to Drop3. Subgoal 1.27.6.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 N14 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + 0 = 1 H8 : is_integer 0 Drop2 : 1 + N14 = 0 Drop3 : drop N14 L3 EE' P : 1 + -1 = 0 H9 : is_integer N14 ============================ X1::L3 = EE'
< apply plus_integer_unique_addend to _ _ _ P Drop2. Subgoal 1.27.6.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + 0 = 1 H8 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H9 : is_integer -1 ============================ X1::L3 = EE'
< GEq: apply drop_geq_0 to Drop3. Subgoal 1.27.6.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + 0 = 1 H8 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H9 : is_integer -1 GEq : -1 >= 0 ============================ X1::L3 = EE'
< LEq: case GEq. Subgoal 1.27.6.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H7 : is_integer 1 Drop1 : 1 + 0 = 1 H8 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H9 : is_integer -1 LEq : 0 <= -1 ============================ X1::L3 = EE'
< case LEq. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Eq : L2 = EE' ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< case Eq. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< assert replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')). Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H7 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< EvA3_P: assert <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H7 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply evalExpr_isOutput to _ _ _ EvA. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H7 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H8 : is_list is_value O2 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply evalExpr_isOutput to _ _ _ EvA2. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H7 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H8 : is_list is_value O2 H9 : is_list is_value O3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< IsO: apply append_values_is to _ _ R5. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H7 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H8 : is_list is_value O2 H9 : is_list is_value O3 IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< App: apply append_values_total to IsO with LB = []. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H7 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H8 : is_list is_value O2 H9 : is_list is_value O3 IsO : is_list is_value O App : O ++ [] = L3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply append_nil_right to App. Subgoal 1.27.6.3.2: Variables: N FE EE V EE' N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' L3 N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V EE' O3 N3 ** R5 : O2 ++ O3 = L3 Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H7 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X T) ([]::([(X, V)]::EE')) O3 H8 : is_list is_value O2 H9 : is_list is_value O3 IsO : is_list is_value L3 App : L3 ++ [] = L3 ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' L3
< search. Subgoal 1.27.6.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V (S::BR) O
< LenEE3: apply evalExpr_keep_scopes to _ _ _ Ev L. Subgoal 1.27.6.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V (S::BR) O
< LenSBR: apply evalExpr_keep_scopes to _ _ _ Ev1 LenEE3. Subgoal 1.27.6.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenSBR : length (S::BR) Len ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V (S::BR) O
< LenBR: case LenSBR. Subgoal 1.27.6.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V (S::BR) O
< apply length_is to LenBR. Subgoal 1.27.6.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenBR : length BR N' LenBR1 : 1 + N' = Len H7 : is_integer N' ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V (S::BR) O
< LEq: apply newNameScopes_length to NNS''' LenBR. Subgoal 1.27.6.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenBR : length BR N' LenBR1 : 1 + N' = Len H7 : is_integer N' LEq : Len <= N' ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V (S::BR) O
< Less: apply lt_plus_one to LenBR1 _. Subgoal 1.27.6.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C trueVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 T V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal EE3 O2 Ev1 : evalExpr FE EE3 T V (S::BR) O3 H4 : is_list (is_list (is_pair is_string is_value)) EE3 H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H6 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) T V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenBR : length BR N' LenBR1 : 1 + N' = Len H7 : is_integer N' LEq : Len <= N' Less : N' < Len ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V (S::BR) O
< apply less_lesseq_flip_false to Less LEq. Subgoal 1.27.6.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) (S::BR) H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< LenSBR: apply evalExpr_keep_scopes to _ _ _ Ev L. Subgoal 1.27.6.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) (S::BR) H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenSBR : length (S::BR) Len ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< LenBR: case LenSBR. Subgoal 1.27.6.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) (S::BR) H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply length_is to LenBR. Subgoal 1.27.6.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) (S::BR) H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H6 : is_integer N' ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< LEq: apply newNameScopes_length to NNS'1 LenBR. Subgoal 1.27.6.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) (S::BR) H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H6 : is_integer N' LEq : Len <= N' ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< Less: apply lt_plus_one to LenBR1 _. Subgoal 1.27.6.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C trueVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) T V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X Ev : evalExpr FE EE C trueVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) T V EE' O3 H4 : is_list (is_list (is_pair is_string is_value)) (S::BR) H5 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C trueVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H6 : is_integer N' LEq : Len <= N' Less : N' < Len ============================ <evalExpr {P}> FE EE (stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X)) V EE' O
< apply less_lesseq_flip_false to Less LEq. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Names: apply names_exists to IsEE. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE N1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< rename N1 to Nmes. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< IsNames: apply names_is to _ Names. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Fr: apply fresh_name_exists to _ IsNames with Base = "X". Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes F1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< rename F1 to X. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Proj: assert Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X). Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< IsN2: apply ext_size_is_int_evalExpr to R3. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< IsN3: apply ext_size_is_int_evalExpr to R4. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< PN2: apply ext_size_pos_evalExpr to R3. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< PN3: apply ext_size_pos_evalExpr to R4. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LEq2: apply lte_left to R2 _ _ _. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LEq3: apply lte_right to R2 _ _ _. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< P: apply plus_integer_is_integer to _ _ R2. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LN4: apply lt_plus_one to R1 _. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LEqN2: apply lesseq_less_integer_transitive to LEq2 LN4. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LEqN3: apply lesseq_less_integer_transitive to LEq3 LN4. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N LEqN3 : N3 < N ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Acc: case Acc. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 IsE : is_expr (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N LEqN3 : N3 < N Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< A2: apply Acc to _ LEqN2. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 IsE : is_expr (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N LEqN3 : N3 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< A3: apply Acc to _ LEqN3. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 IsE : is_expr (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) IsN2 : is_integer N2 IsN3 : is_integer N3 PN2 : 0 <= N2 PN3 : 0 <= N3 LEq2 : N2 <= N4 LEq3 : N3 <= N4 P : is_integer N4 LN4 : N4 < N LEqN2 : N2 < N LEqN3 : N3 < N Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N2 * A3 : acc N3 * ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< clear Acc LEqN3 LEqN2 LN4 P LEq3 LEq2 PN3 PN2 IsN3 IsN2. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 IsE : is_expr (condExpr C T F) R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< case IsE. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< apply IH to R3 A2 _ _ _. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Ev: apply drop_ext_size_evalExpr to R3. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Ev1: apply drop_ext_size_evalExpr to R4. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< apply IH to R4 A3 _ _ _. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< L: apply length_exists_list_pair_string_value to IsEE. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE N1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< rename N1 to Len. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< EvD: assert evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) []. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< NNS: assert newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE. Subgoal 1.28.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE
< unfold . Subgoal 1.28.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ exists N SNames BNames, ((((length EE Len /\ drop N ([(X, intVal 0)]::EE) EE) /\ take N ([(X, intVal 0)]::EE) [[(X, intVal 0)]]) /\ names [[(X, intVal 0)]] SNames) /\ names EE BNames) /\ (forall X1, mem X1 SNames -> mem X1 BNames -> false)
< exists 1, [X], Nmes. Subgoal 1.28.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ ((((length EE Len /\ drop 1 ([(X, intVal 0)]::EE) EE) /\ take 1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]) /\ names [[(X, intVal 0)]] [X]) /\ names EE Nmes) /\ (forall X1, mem X1 [X] -> mem X1 Nmes -> false)
< split. Subgoal 1.28.1.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ length EE Len
< search. Subgoal 1.28.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ drop 1 ([(X, intVal 0)]::EE) EE
< search. Subgoal 1.28.1.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ take 1 ([(X, intVal 0)]::EE) [[(X, intVal 0)]]
< search. Subgoal 1.28.1.4: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ names [[(X, intVal 0)]] [X]
< search. Subgoal 1.28.1.5: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ names EE Nmes
< search. Subgoal 1.28.1.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] ============================ forall X1, mem X1 [X] -> mem X1 Nmes -> false
< intros MX MN. Subgoal 1.28.1.6: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] MX : mem X1 [X] MN : mem X1 Nmes ============================ false
< MX: case MX. Subgoal 1.28.1.6.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] MN : mem X Nmes ============================ false
< apply fresh_name_not_mem to _ MN. Subgoal 1.28.1.6.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] MN : mem X1 Nmes MX : mem X1 [] ============================ false
< case MX. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< IsX: apply fresh_name_is to _ Fr. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< assert is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)). Subgoal 1.28.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X ============================ is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE))
< search 6. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< EvA_ES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R3 NNS. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 N2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< EvA_P: apply IH to EvA_ES A2 _ _ _. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< EvA: apply drop_ext_size_evalExpr to EvA_ES. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< NNS': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA Ev _. Subgoal 1.28: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 NNS' : newNameScopes [[(X, intVal 0)]] Len EE_A' EE3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< NNS': case NNS' (keep). Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal EE_A' O2 NNS' : newNameScopes [[(X, intVal 0)]] Len EE_A' EE3 NNS'1 : length EE3 Len NNS'2 : drop N1 EE_A' EE3 NNS'3 : take N1 EE_A' [[(X, intVal 0)]] NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Take: case NNS'3. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len N1 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop N1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + N5 = N1 Take1 : take N5 L [] ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< case Take1. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop N1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = N1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< compute Take. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Eq: assert L = EE3. Subgoal 1.28.3.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ L = EE3
< Drop: case NNS'2. Subgoal 1.28.3.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop1 : drop N6 L EE3 ============================ L = EE3
< apply drop_is_integer to Drop1. Subgoal 1.28.3.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + N6 = 1 Drop1 : drop N6 L EE3 H8 : is_integer N6 ============================ L = EE3
< apply plus_integer_unique_addend to _ _ _ Take Drop. Subgoal 1.28.3.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 Drop1 : drop 0 L EE3 H8 : is_integer 0 ============================ L = EE3
< Drop: case Drop1. Subgoal 1.28.3.1.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 ============================ EE3 = EE3
< search. Subgoal 1.28.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N7 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 Drop1 : 1 + N7 = 0 Drop2 : drop N7 L1 EE3 ============================ X1::L1 = EE3
< P: assert 1 + -1 = 0. Subgoal 1.28.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N7 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 Drop1 : 1 + N7 = 0 Drop2 : drop N7 L1 EE3 P : 1 + -1 = 0 ============================ X1::L1 = EE3
< apply drop_is_integer to Drop2. Subgoal 1.28.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N7 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 Drop1 : 1 + N7 = 0 Drop2 : drop N7 L1 EE3 P : 1 + -1 = 0 H9 : is_integer N7 ============================ X1::L1 = EE3
< apply plus_integer_unique_addend to _ _ _ Drop1 P. Subgoal 1.28.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H9 : is_integer -1 ============================ X1::L1 = EE3
< GEq: apply drop_geq_0 to Drop2. Subgoal 1.28.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H9 : is_integer -1 GEq : -1 >= 0 ============================ X1::L1 = EE3
< LEq: case GEq. Subgoal 1.28.3.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::(X1::L1)) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::(X1::L1)) EE3 NNS'1 : length EE3 Len NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Drop : 1 + 0 = 1 H8 : is_integer 0 Drop1 : 1 + -1 = 0 Drop2 : drop -1 L1 EE3 P : 1 + -1 = 0 H9 : is_integer -1 LEq : 0 <= -1 ============================ X1::L1 = EE3
< case LEq. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::L) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::L) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::L) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 Eq : L = EE3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< case Eq. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< apply evalExpr_isCtx to _ _ _ EvA. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< NNS'': assert newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< EvA2_ES: apply evalExpr_newNameScopes_exists_ES to _ _ _ _ R4 NNS''. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 N3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< EvA2_P: apply IH to EvA2_ES A3 _ _ _. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< EvA2: apply drop_ext_size_evalExpr to EvA2_ES. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< NNS''': apply evalExpr_newNameScopes_ctx to _ _ _ _ EvA2 Ev1 _. Subgoal 1.28.3: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len EE_A'1 EE' ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< NNS''': case NNS'''. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames EE_A'1 N6 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V EE_A'1 O3 NNS''' : length EE' Len NNS'''1 : drop N6 EE_A'1 EE' NNS'''2 : take N6 EE_A'1 [[], [(X, intVal 0)]] NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< T: case NNS'''2. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N6 SNames1 BNames1 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::L1) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::L1) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::L1) O3 NNS''' : length EE' Len NNS'''1 : drop N6 ([]::L1) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N7 = N6 T1 : take N7 L1 [[(X, intVal 0)]] ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< T: case T1. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N6 SNames1 BNames1 N7 N9 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop N6 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N7 = N6 T1 : 1 + N9 = N7 T2 : take N9 L2 [] ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< case T2. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N6 SNames1 BNames1 N7 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop N6 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + N7 = N6 T1 : 1 + 0 = N7 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< compute T1. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames N6 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop N6 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = N6 T1 : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< compute T. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Eq: assert L2 = EE'. Subgoal 1.28.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ L2 = EE'
< Drop: case NNS'''1. Subgoal 1.28.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 L2 N10 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + N10 = 2 Drop1 : drop N10 ([(X, intVal 0)]::L2) EE' ============================ L2 = EE'
< apply drop_is_integer to Drop1. Subgoal 1.28.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 L2 N10 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + N10 = 2 Drop1 : drop N10 ([(X, intVal 0)]::L2) EE' H9 : is_integer N10 ============================ L2 = EE'
< apply plus_integer_unique_addend to _ _ _ T Drop. Subgoal 1.28.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 Drop1 : drop 1 ([(X, intVal 0)]::L2) EE' H9 : is_integer 1 ============================ L2 = EE'
< Drop: case Drop1. Subgoal 1.28.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 L2 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + N11 = 1 Drop2 : drop N11 L2 EE' ============================ L2 = EE'
< apply drop_is_integer to Drop2. Subgoal 1.28.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 L2 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + N11 = 1 Drop2 : drop N11 L2 EE' H10 : is_integer N11 ============================ L2 = EE'
< apply plus_integer_unique_addend to _ _ _ T1 Drop1. Subgoal 1.28.3.2.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + 0 = 1 Drop2 : drop 0 L2 EE' H10 : is_integer 0 ============================ L2 = EE'
< Drop: case Drop2. Subgoal 1.28.3.2.1.1: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + 0 = 1 H10 : is_integer 0 ============================ EE' = EE'
< search. Subgoal 1.28.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 N14 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + 0 = 1 H10 : is_integer 0 Drop2 : 1 + N14 = 0 Drop3 : drop N14 L3 EE' ============================ X1::L3 = EE'
< P: assert 1 + -1 = 0. Subgoal 1.28.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 N14 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + 0 = 1 H10 : is_integer 0 Drop2 : 1 + N14 = 0 Drop3 : drop N14 L3 EE' P : 1 + -1 = 0 ============================ X1::L3 = EE'
< apply drop_is_integer to Drop3. Subgoal 1.28.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 N14 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + 0 = 1 H10 : is_integer 0 Drop2 : 1 + N14 = 0 Drop3 : drop N14 L3 EE' P : 1 + -1 = 0 H11 : is_integer N14 ============================ X1::L3 = EE'
< apply plus_integer_unique_addend to _ _ _ P Drop2. Subgoal 1.28.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + 0 = 1 H10 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H11 : is_integer -1 ============================ X1::L3 = EE'
< GEq: apply drop_geq_0 to Drop3. Subgoal 1.28.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + 0 = 1 H10 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H11 : is_integer -1 GEq : -1 >= 0 ============================ X1::L3 = EE'
< LEq: case GEq. Subgoal 1.28.3.2.1.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::(X1::L3))) O3 NNS''' : length EE' Len NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Drop : 1 + 1 = 2 H9 : is_integer 1 Drop1 : 1 + 0 = 1 H10 : is_integer 0 Drop2 : 1 + -1 = 0 Drop3 : drop -1 L3 EE' P : 1 + -1 = 0 H11 : is_integer -1 LEq : 0 <= -1 ============================ X1::L3 = EE'
< case LEq. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::L2)) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::L2)) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 Eq : L2 = EE' ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< case Eq. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< assert replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')). Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H9 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< EvA3_P: assert <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H9 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< apply evalExpr_isOutput to _ _ _ EvA. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H9 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H10 : is_list is_value O2 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< apply evalExpr_isOutput to _ _ _ EvA2. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H9 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H10 : is_list is_value O2 H11 : is_list is_value O3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< IsO: apply append_values_is to _ _ R5. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H9 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H10 : is_list is_value O2 H11 : is_list is_value O3 IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< App: apply append_values_total to IsO with LB = []. Subgoal 1.28.3.2: Variables: N FE EE V EE' O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H9 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H10 : is_list is_value O2 H11 : is_list is_value O3 IsO : is_list is_value O App : O ++ [] = L3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< apply append_nil_right to App. Subgoal 1.28.3.2: Variables: N FE EE V EE' N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames SNames1 BNames1 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V EE' L3 N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V EE' O3 N3 ** R5 : O2 ++ O3 = L3 Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V ([]::([(X, intVal 0)]::EE')) O3 NNS''' : length EE' Len NNS'''1 : drop 2 ([]::([(X, intVal 0)]::EE')) EE' NNS'''3 : names [[], [(X, intVal 0)]] SNames1 NNS'''4 : names EE' BNames1 NNS'''5 : forall X1, mem X1 SNames1 -> mem X1 BNames1 -> false T : 1 + 1 = 2 T1 : 1 + 0 = 1 H9 : replaceScopes X V ([]::([(X, intVal 0)]::EE')) ([]::([(X, V)]::EE')) EvA3_P : <evalStmt {P}> FE ([]::([(X, intVal 0)]::EE3)) (assign X F) ([]::([(X, V)]::EE')) O3 H10 : is_list is_value O2 H11 : is_list is_value O3 IsO : is_list is_value L3 App : L3 ++ [] = L3 ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' L3
< search. Subgoal 1.28.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V (S::BR) O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR ============================ <evalExpr {P}> FE EE (condExpr C T F) V (S::BR) O
< LenEE3: apply evalExpr_keep_scopes to _ _ _ Ev L. Subgoal 1.28.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V (S::BR) O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len ============================ <evalExpr {P}> FE EE (condExpr C T F) V (S::BR) O
< LenSBR: apply evalExpr_keep_scopes to _ _ _ Ev1 LenEE3. Subgoal 1.28.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V (S::BR) O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenSBR : length (S::BR) Len ============================ <evalExpr {P}> FE EE (condExpr C T F) V (S::BR) O
< LenBR: case LenSBR. Subgoal 1.28.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V (S::BR) O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ <evalExpr {P}> FE EE (condExpr C T F) V (S::BR) O
< apply length_is to LenBR. Subgoal 1.28.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V (S::BR) O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenBR : length BR N' LenBR1 : 1 + N' = Len H9 : is_integer N' ============================ <evalExpr {P}> FE EE (condExpr C T F) V (S::BR) O
< LEq: apply newNameScopes_length to NNS''' LenBR. Subgoal 1.28.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V (S::BR) O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenBR : length BR N' LenBR1 : 1 + N' = Len H9 : is_integer N' LEq : Len <= N' ============================ <evalExpr {P}> FE EE (condExpr C T F) V (S::BR) O
< Less: apply lt_plus_one to LenBR1 _. Subgoal 1.28.3.3: Variables: N FE EE V O N2 N3 N4 EE3 O2 O3 F T C Nmes X Len SNames BNames 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) V (S::BR) O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N4 = N R2 : N2 + N3 = N4 R3 : <evalExpr {ES}> FE EE C falseVal EE3 O2 N2 ** R4 : <evalExpr {ES}> FE EE3 F V (S::BR) O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal EE3 O2 Ev : evalExpr FE EE C falseVal EE3 O2 Ev1 : evalExpr FE EE3 F V (S::BR) O3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : <evalExpr {P}> FE EE3 F V (S::BR) O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal ([(X, intVal 0)]::EE3) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE3) EE3 NNS'1 : length EE3 Len NNS'2 : drop 1 ([(X, intVal 0)]::EE3) EE3 NNS'4 : names [[(X, intVal 0)]] SNames NNS'5 : names EE3 BNames NNS'6 : forall X1, mem X1 SNames -> mem X1 BNames -> false Take : 1 + 0 = 1 H8 : is_list (is_list (is_pair is_string is_value)) ([(X, intVal 0)]::EE3) NNS'' : newNameScopes [[], [(X, intVal 0)]] Len ([]::([(X, intVal 0)]::EE3)) EE3 EvA2_ES : <evalExpr {ES}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 N3 EvA2_P : <evalExpr {P}> FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 EvA2 : evalExpr FE ([]::([(X, intVal 0)]::EE3)) F V (S::AR) O3 NNS''' : newNameScopes [[], [(X, intVal 0)]] Len AR BR LenEE3 : length EE3 Len LenBR : length BR N' LenBR1 : 1 + N' = Len H9 : is_integer N' LEq : Len <= N' Less : N' < Len ============================ <evalExpr {P}> FE EE (condExpr C T F) V (S::BR) O
< apply less_lesseq_flip_false to Less LEq. Subgoal 1.28.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal (S::BR) O2 Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : <evalExpr {P}> FE (S::BR) F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LenSBR: apply evalExpr_keep_scopes to _ _ _ Ev L. Subgoal 1.28.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal (S::BR) O2 Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : <evalExpr {P}> FE (S::BR) F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenSBR : length (S::BR) Len ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LenBR: case LenSBR. Subgoal 1.28.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal (S::BR) O2 Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : <evalExpr {P}> FE (S::BR) F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< apply length_is to LenBR. Subgoal 1.28.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal (S::BR) O2 Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : <evalExpr {P}> FE (S::BR) F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H8 : is_integer N' ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< LEq: apply newNameScopes_length to NNS'1 LenBR. Subgoal 1.28.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal (S::BR) O2 Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : <evalExpr {P}> FE (S::BR) F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H8 : is_integer N' LEq : Len <= N' ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< Less: apply lt_plus_one to LenBR1 _. Subgoal 1.28.4: Variables: N FE EE V EE' O N2 N3 N4 O2 O3 F T C Nmes X Len 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 E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (condExpr C T F) 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 C falseVal (S::BR) O2 N2 ** R4 : <evalExpr {ES}> FE (S::BR) F V EE' O3 N3 ** R5 : O2 ++ O3 = O Names : names EE Nmes IsNames : is_list is_string Nmes Fr : fresh_name "X" Nmes X Proj : Nmes |{expr}- condExpr C T F ~~> stmtExpr (seq (declare intTy X (num 0)) (ifThenElse C (assign X T) (assign X F))) (name X) A2 : acc N2 * A3 : acc N3 * H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : <evalExpr {P}> FE EE C falseVal (S::BR) O2 Ev : evalExpr FE EE C falseVal (S::BR) O2 Ev1 : evalExpr FE (S::BR) F V EE' O3 H5 : is_list (is_list (is_pair is_string is_value)) (S::BR) H6 : <evalExpr {P}> FE (S::BR) F V EE' O3 L : length EE Len EvD : evalStmt FE ([]::EE) (declare intTy X (num 0)) ([(X, intVal 0)]::EE) [] NNS : newNameScopes [[(X, intVal 0)]] Len ([(X, intVal 0)]::EE) EE IsX : is_string X H7 : is_list (is_list (is_pair is_string is_value)) ([]::([(X, intVal 0)]::EE)) EvA_ES : <evalExpr {ES}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 N2 EvA_P : <evalExpr {P}> FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 EvA : evalExpr FE ([(X, intVal 0)]::EE) C falseVal (S::AR) O2 NNS' : newNameScopes [[(X, intVal 0)]] Len (S::AR) (S::BR) NNS'1 : newNameScopes [[(X, intVal 0)]] Len AR BR LenBR : length BR N' LenBR1 : 1 + N' = Len H8 : is_integer N' LEq : Len <= N' Less : N' < Len ============================ <evalExpr {P}> FE EE (condExpr C T F) V EE' O
< apply less_lesseq_flip_false to Less LEq. 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.
< 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. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (condExpr C T F) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) Ty Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) Ty Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 1.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (condExpr C T F) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) Ty Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) Ty Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 1.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 ============================ related_all_scopes ET EE'
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ Ty2 Ev2 _ _. Subgoal 1.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (condExpr C T F) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) Ty Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O ============================ valueType V Ty
< case IsE. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) Ty Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty ============================ valueType V Ty
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 ============================ valueType V Ty
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ valueType V Ty
< apply IH_T_E to _ _ _ _ _ Ty1 Ev2 _ _. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : valueType V Ty ============================ valueType V Ty
< search. Subgoal 2.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (condExpr C T F) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) Ty Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O ============================ valueType V Ty
< case IsE. Subgoal 2.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (condExpr C T F) Ty Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty ============================ valueType V Ty
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 2.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 ============================ valueType V Ty
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 2.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ valueType V Ty
< apply IH_T_E to _ _ _ _ _ Ty2 Ev2 _ _. Subgoal 2.28: Variables: FT ET Ty FE EE EE' O V EE3 O2 O3 F T C IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) 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 C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F Ty : typeOf FT ET C boolTy Ty1 : typeOf FT ET T Ty Ty2 : typeOf FT ET F Ty H4 : related_all_scopes ET EE3 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : valueType V Ty ============================ valueType V Ty
< 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. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 ============================ output_forms O
< apply IH_E to _ _ _ Ev2. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 1.27: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C trueVal EE3 O2 * Ev2 : evalExpr FE EE3 T V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 H7 : output_forms O ============================ output_forms O
< search. Subgoal 1.28: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsE : is_expr (condExpr C T F) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O ============================ output_forms O
< case IsE. Subgoal 1.28: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : output_forms O2 ============================ output_forms O
< apply evalExpr_isCtx to _ _ _ Ev1. Subgoal 1.28: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : output_forms O2 H5 : 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 V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 ============================ output_forms O
< apply output_forms_append to _ _ Ev3. Subgoal 1.28: Variables: FE EE V EE' O EE3 O2 O3 F T C 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 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (condExpr C T F) V EE' O @ Ev1 : evalExpr FE EE C falseVal EE3 O2 * Ev2 : evalExpr FE EE3 F V EE' O3 * Ev3 : O2 ++ O3 = O H1 : is_expr C H2 : is_expr T H3 : is_expr F H4 : output_forms O2 H5 : is_list (is_list (is_pair is_string is_value)) EE3 H6 : output_forms O3 H7 : output_forms O ============================ output_forms O
< search. Proof completed.
< Prove exactEval:host:evalProgram_output_forms. Proof completed.
< Prove exactEval:host:paramName_exists. Proof completed.
< Prove exactEval:host:getFunEvalInfo_exists. Proof completed.