< Module simple_imp:list.
< Prove_Constraint simple_imp:host:proj_e_unique. Subgoal 1: Variables: E2 Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : |{e}- nil Ty ~~> E2 ============================ recBuild (addRecFieldExprs "null" true endRecFieldExprs) = E2
< case Hyp1. Subgoal 1: Variables: Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) ============================ recBuild (addRecFieldExprs "null" true endRecFieldExprs) = recBuild (addRecFieldExprs "null" true endRecFieldExprs)
< search. Subgoal 2: Variables: E2 E4 E3 Hyp : |{e}- cons E3 E4 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E3 (addRecFieldExprs "tail" E4 endRecFieldExprs))) Hyp1 : |{e}- cons E3 E4 ~~> E2 ============================ recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E3 (addRecFieldExprs "tail" E4 endRecFieldExprs))) = E2
< case Hyp1. Subgoal 2: Variables: E4 E3 Hyp : |{e}- cons E3 E4 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E3 (addRecFieldExprs "tail" E4 endRecFieldExprs))) ============================ recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E3 (addRecFieldExprs "tail" E4 endRecFieldExprs))) = recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E3 (addRecFieldExprs "tail" E4 endRecFieldExprs)))
< search. Subgoal 3: Variables: E1 E2 Hyp : |{e}- null E1 ~~> E1 Hyp1 : |{e}- null E1 ~~> E2 ============================ E1 = E2
< case Hyp1. Subgoal 3: Variables: E2 Hyp : |{e}- null E2 ~~> E2 ============================ E2 = E2
< search. Subgoal 4: Variables: E1 E2 Hyp : |{e}- head E1 ~~> E1 Hyp1 : |{e}- head E1 ~~> E2 ============================ E1 = E2
< case Hyp1. Subgoal 4: Variables: E2 Hyp : |{e}- head E2 ~~> E2 ============================ E2 = E2
< search. Subgoal 5: Variables: E1 E2 Hyp : |{e}- tail E1 ~~> E1 Hyp1 : |{e}- tail E1 ~~> E2 ============================ E1 = E2
< case Hyp1. Subgoal 5: Variables: E2 Hyp : |{e}- tail E2 ~~> E2 ============================ E2 = E2
< search. Subgoal 6: Variables: E2 Index Lst Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp1 : |{e}- index Lst Index ~~> E2 ============================ and (null Lst) (eq (num 0) Index) = E2
< case Hyp1. Subgoal 6: Variables: Index Lst Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) ============================ and (null Lst) (eq (num 0) Index) = and (null Lst) (eq (num 0) Index)
< search. Subgoal 7: Variables: E1 E2 Hyp : |{e}- simple_imp:list:length E1 ~~> E1 Hyp1 : |{e}- simple_imp:list:length E1 ~~> E2 ============================ E1 = E2
< case Hyp1. Subgoal 7: Variables: E2 Hyp : |{e}- simple_imp:list:length E2 ~~> E2 ============================ E2 = E2
< search. Proof completed.
< Prove_Constraint simple_imp:host:proj_e_is. Subgoal 1: Variables: Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : is_e (nil Ty) ============================ is_e (recBuild (addRecFieldExprs "null" true endRecFieldExprs))
< search 8. Subgoal 2: Variables: E2 E1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp1 : is_e (cons E1 E2) ============================ is_e (recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))))
< case Hyp1. Subgoal 2: Variables: E2 E1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : is_e E1 H2 : is_e E2 ============================ is_e (recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))))
< search 10. Subgoal 3: Variables: E' Hyp : |{e}- null E' ~~> E' Hyp1 : is_e (null E') ============================ is_e E'
< case Hyp1. Subgoal 3: Variables: E' Hyp : |{e}- null E' ~~> E' H1 : is_e E' ============================ is_e E'
< search 7. Subgoal 4: Variables: E' Hyp : |{e}- head E' ~~> E' Hyp1 : is_e (head E') ============================ is_e E'
< case Hyp1. Subgoal 4: Variables: E' Hyp : |{e}- head E' ~~> E' H1 : is_e E' ============================ is_e E'
< search 7. Subgoal 5: Variables: E' Hyp : |{e}- tail E' ~~> E' Hyp1 : is_e (tail E') ============================ is_e E'
< case Hyp1. Subgoal 5: Variables: E' Hyp : |{e}- tail E' ~~> E' H1 : is_e E' ============================ is_e E'
< search 7. Subgoal 6: Variables: Index Lst Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp1 : is_e (index Lst Index) ============================ is_e (and (null Lst) (eq (num 0) Index))
< case Hyp1. Subgoal 6: Variables: Index Lst Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) H1 : is_e Lst H2 : is_e Index ============================ is_e (and (null Lst) (eq (num 0) Index))
< search. Subgoal 7: Variables: E' Hyp : |{e}- simple_imp:list:length E' ~~> E' Hyp1 : is_e (simple_imp:list:length E') ============================ is_e E'
< case Hyp1. Subgoal 7: Variables: E' Hyp : |{e}- simple_imp:list:length E' ~~> E' H1 : is_e E' ============================ is_e E'
< search. Proof completed.
< Prove_Constraint simple_imp:host:proj_rf_unique. Proof completed.
< Prove_Constraint simple_imp:host:proj_rf_is. Proof completed.
< Prove_Constraint simple_imp:host:proj_c_unique. Proof completed.
< Prove_Constraint simple_imp:host:proj_c_is. Proof completed.
< Prove_Constraint simple_imp:host:proj_recFields_unique. Proof completed.
< Prove_Constraint simple_imp:host:proj_recFields_is. Proof completed.
< Prove_Constraint simple_imp:host:proj_ty_unique. Variables: Ty2 T Hyp : |{ty}- listTy T ~~> recTy [("head", T), ("tail", listTy T), ("null", boolTy)] Hyp1 : |{ty}- listTy T ~~> Ty2 ============================ recTy [("head", T), ("tail", listTy T), ("null", boolTy)] = Ty2
< case Hyp1. Variables: T Hyp : |{ty}- listTy T ~~> recTy [("head", T), ("tail", listTy T), ("null", boolTy)] ============================ recTy [("head", T), ("tail", listTy T), ("null", boolTy)] = recTy [("head", T), ("tail", listTy T), ("null", boolTy)]
< search. Proof completed.
< Prove_Constraint simple_imp:host:proj_ty_is. Variables: T Hyp : |{ty}- listTy T ~~> recTy [("head", T), ("tail", listTy T), ("null", boolTy)] Hyp1 : is_ty (listTy T) ============================ is_ty (recTy [("head", T), ("tail", listTy T), ("null", boolTy)])
< case Hyp1. Variables: T Hyp : |{ty}- listTy T ~~> recTy [("head", T), ("tail", listTy T), ("null", boolTy)] H1 : is_ty T ============================ is_ty (recTy [("head", T), ("tail", listTy T), ("null", boolTy)])
< search 11. Proof completed.
< Prove_Constraint simple_imp:host:proj_value_unique. Subgoal 1: Variables: V2 Hyp : |{value}- nilVal ~~> recVal [("null", trueVal)] Hyp1 : |{value}- nilVal ~~> V2 ============================ recVal [("null", trueVal)] = V2
< case Hyp1. Subgoal 1: Hyp : |{value}- nilVal ~~> recVal [("null", trueVal)] ============================ recVal [("null", trueVal)] = recVal [("null", trueVal)]
< search. Subgoal 2: Variables: V2 Tl Hd Hyp : |{value}- consVal Hd Tl ~~> recVal [("head", Hd), ("tail", Tl), ("null", falseVal)] Hyp1 : |{value}- consVal Hd Tl ~~> V2 ============================ recVal [("head", Hd), ("tail", Tl), ("null", falseVal)] = V2
< case Hyp1. Subgoal 2: Variables: Tl Hd Hyp : |{value}- consVal Hd Tl ~~> recVal [("head", Hd), ("tail", Tl), ("null", falseVal)] ============================ recVal [("head", Hd), ("tail", Tl), ("null", falseVal)] = recVal [("head", Hd), ("tail", Tl), ("null", falseVal)]
< search. Proof completed.
< Prove_Constraint simple_imp:host:proj_value_is. Subgoal 1: Hyp : |{value}- nilVal ~~> recVal [("null", trueVal)] Hyp1 : is_value nilVal ============================ is_value (recVal [("null", trueVal)])
< search 9. Subgoal 2: Variables: Tl Hd Hyp : |{value}- consVal Hd Tl ~~> recVal [("head", Hd), ("tail", Tl), ("null", falseVal)] Hyp1 : is_value (consVal Hd Tl) ============================ is_value (recVal [("head", Hd), ("tail", Tl), ("null", falseVal)])
< case Hyp1. Subgoal 2: Variables: Tl Hd Hyp : |{value}- consVal Hd Tl ~~> recVal [("head", Hd), ("tail", Tl), ("null", falseVal)] H1 : is_value Hd H2 : is_value Tl ============================ is_value (recVal [("head", Hd), ("tail", Tl), ("null", falseVal)])
< search 11. Proof completed.
< Prove simple_imp:host:vars_join, simple_imp:host:vars_rf_join. Subgoal 1.12: Variables: D Ty IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (nil Ty) [] @ ============================ exists D', [] ++ D = D'
< search. Subgoal 1.13: Variables: V D D2 D3 E2 E1 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (cons E1 E2) V @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = V ============================ exists D', V ++ D = D'
< J2: apply IH to Vars2 with D = D. Subgoal 1.13: Variables: V D D2 D3 E2 E1 D' IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (cons E1 E2) V @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = V J2 : D3 ++ D = D' ============================ exists D', V ++ D = D'
< J1: apply IH to Vars1 with D = D'. Subgoal 1.13: Variables: V D D2 D3 E2 E1 D' D'1 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (cons E1 E2) V @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = V J2 : D3 ++ D = D' J1 : D2 ++ D' = D'1 ============================ exists D', V ++ D = D'
< JApp: apply append_associative_back to J2 J1. Subgoal 1.13: Variables: V D D2 D3 E2 E1 D' D'1 L12 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (cons E1 E2) V @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = V J2 : D3 ++ D = D' J1 : D2 ++ D' = D'1 JApp : D2 ++ D3 = L12 JApp1 : L12 ++ D = D'1 ============================ exists D', V ++ D = D'
< apply append_unique to Vars3 JApp. Subgoal 1.13: Variables: D D2 D3 E2 E1 D' D'1 L12 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (cons E1 E2) L12 @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = L12 J2 : D3 ++ D = D' J1 : D2 ++ D' = D'1 JApp : D2 ++ D3 = L12 JApp1 : L12 ++ D = D'1 ============================ exists D', L12 ++ D = D'
< search. Subgoal 1.14: Variables: V D E1 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (null E1) V @ Vars1 : vars E1 V * ============================ exists D', V ++ D = D'
< apply IH to Vars1 with D = D. Subgoal 1.14: Variables: V D E1 D' IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (null E1) V @ Vars1 : vars E1 V * H1 : V ++ D = D' ============================ exists D', V ++ D = D'
< search. Subgoal 1.15: Variables: V D E1 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (head E1) V @ Vars1 : vars E1 V * ============================ exists D', V ++ D = D'
< apply IH to Vars1 with D = D. Subgoal 1.15: Variables: V D E1 D' IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (head E1) V @ Vars1 : vars E1 V * H1 : V ++ D = D' ============================ exists D', V ++ D = D'
< search. Subgoal 1.16: Variables: V D E1 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (tail E1) V @ Vars1 : vars E1 V * ============================ exists D', V ++ D = D'
< apply IH to Vars1 with D = D. Subgoal 1.16: Variables: V D E1 D' IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (tail E1) V @ Vars1 : vars E1 V * H1 : V ++ D = D' ============================ exists D', V ++ D = D'
< search. Subgoal 1.17: Variables: V D D2 D3 E2 E1 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (index E1 E2) V @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = V ============================ exists D', V ++ D = D'
< J2: apply IH to Vars2 with D = D. Subgoal 1.17: Variables: V D D2 D3 E2 E1 D' IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (index E1 E2) V @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = V J2 : D3 ++ D = D' ============================ exists D', V ++ D = D'
< J1: apply IH to Vars1 with D = D'. Subgoal 1.17: Variables: V D D2 D3 E2 E1 D' D'1 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (index E1 E2) V @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = V J2 : D3 ++ D = D' J1 : D2 ++ D' = D'1 ============================ exists D', V ++ D = D'
< JApp: apply append_associative_back to J2 J1. Subgoal 1.17: Variables: V D D2 D3 E2 E1 D' D'1 L12 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (index E1 E2) V @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = V J2 : D3 ++ D = D' J1 : D2 ++ D' = D'1 JApp : D2 ++ D3 = L12 JApp1 : L12 ++ D = D'1 ============================ exists D', V ++ D = D'
< apply append_unique to Vars3 JApp. Subgoal 1.17: Variables: D D2 D3 E2 E1 D' D'1 L12 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (index E1 E2) L12 @ Vars1 : vars E1 D2 * Vars2 : vars E2 D3 * Vars3 : D2 ++ D3 = L12 J2 : D3 ++ D = D' J1 : D2 ++ D' = D'1 JApp : D2 ++ D3 = L12 JApp1 : L12 ++ D = D'1 ============================ exists D', L12 ++ D = D'
< search. Subgoal 1.18: Variables: V D E1 IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (simple_imp:list:length E1) V @ Vars1 : vars E1 V * ============================ exists D', V ++ D = D'
< apply IH to Vars1 with D = D. Subgoal 1.18: Variables: V D E1 D' IH : forall E V D, vars E V * -> exists D', V ++ D = D' IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D' Vars : vars (simple_imp:list:length E1) V @ Vars1 : vars E1 V * H1 : V ++ D = D' ============================ exists D', V ++ D = D'
< search. Proof completed.
< Prove simple_imp:host:vars_unique, simple_imp:host:vars_rf_unique. Subgoal 1.12: Variables: V2 Ty IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (nil Ty) [] @ Vars2 : vars (nil Ty) V2 ============================ [] = V2
< case Vars2. Subgoal 1.12: Variables: Ty IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (nil Ty) [] @ ============================ [] = []
< search. Subgoal 1.13: Variables: V1 V2 D1 D2 E2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V1 @ Vars2 : vars (cons E1 E2) V2 Vars3 : vars E1 D1 * Vars4 : vars E2 D2 * Vars5 : D1 ++ D2 = V1 ============================ V1 = V2
< Vars2: case Vars2. Subgoal 1.13: Variables: V1 V2 D1 D2 E2 E1 D3 D4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V1 @ Vars3 : vars E1 D1 * Vars4 : vars E2 D2 * Vars5 : D1 ++ D2 = V1 Vars2 : vars E1 D3 Vars6 : vars E2 D4 Vars7 : D3 ++ D4 = V2 ============================ V1 = V2
< apply IH to Vars3 Vars2. Subgoal 1.13: Variables: V1 V2 D2 E2 E1 D3 D4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V1 @ Vars3 : vars E1 D3 * Vars4 : vars E2 D2 * Vars5 : D3 ++ D2 = V1 Vars2 : vars E1 D3 Vars6 : vars E2 D4 Vars7 : D3 ++ D4 = V2 ============================ V1 = V2
< apply IH to Vars4 Vars6. Subgoal 1.13: Variables: V1 V2 E2 E1 D3 D4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V1 @ Vars3 : vars E1 D3 * Vars4 : vars E2 D4 * Vars5 : D3 ++ D4 = V1 Vars2 : vars E1 D3 Vars6 : vars E2 D4 Vars7 : D3 ++ D4 = V2 ============================ V1 = V2
< apply append_unique to Vars5 Vars7. Subgoal 1.13: Variables: V2 E2 E1 D3 D4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V2 @ Vars3 : vars E1 D3 * Vars4 : vars E2 D4 * Vars5 : D3 ++ D4 = V2 Vars2 : vars E1 D3 Vars6 : vars E2 D4 Vars7 : D3 ++ D4 = V2 ============================ V2 = V2
< search. Subgoal 1.14: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (null E1) V1 @ Vars2 : vars (null E1) V2 Vars3 : vars E1 V1 * ============================ V1 = V2
< Vars2: case Vars2. Subgoal 1.14: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (null E1) V1 @ Vars3 : vars E1 V1 * Vars2 : vars E1 V2 ============================ V1 = V2
< apply IH to Vars3 Vars2. Subgoal 1.14: Variables: V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (null E1) V2 @ Vars3 : vars E1 V2 * Vars2 : vars E1 V2 ============================ V2 = V2
< search. Subgoal 1.15: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (head E1) V1 @ Vars2 : vars (head E1) V2 Vars3 : vars E1 V1 * ============================ V1 = V2
< Vars2: case Vars2. Subgoal 1.15: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (head E1) V1 @ Vars3 : vars E1 V1 * Vars2 : vars E1 V2 ============================ V1 = V2
< apply IH to Vars3 Vars2. Subgoal 1.15: Variables: V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (head E1) V2 @ Vars3 : vars E1 V2 * Vars2 : vars E1 V2 ============================ V2 = V2
< search. Subgoal 1.16: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (tail E1) V1 @ Vars2 : vars (tail E1) V2 Vars3 : vars E1 V1 * ============================ V1 = V2
< Vars2: case Vars2. Subgoal 1.16: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (tail E1) V1 @ Vars3 : vars E1 V1 * Vars2 : vars E1 V2 ============================ V1 = V2
< apply IH to Vars3 Vars2. Subgoal 1.16: Variables: V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (tail E1) V2 @ Vars3 : vars E1 V2 * Vars2 : vars E1 V2 ============================ V2 = V2
< search. Subgoal 1.17: Variables: V1 V2 D1 D2 E2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (index E1 E2) V1 @ Vars2 : vars (index E1 E2) V2 Vars3 : vars E1 D1 * Vars4 : vars E2 D2 * Vars5 : D1 ++ D2 = V1 ============================ V1 = V2
< Vars2: case Vars2. Subgoal 1.17: Variables: V1 V2 D1 D2 E2 E1 D3 D4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (index E1 E2) V1 @ Vars3 : vars E1 D1 * Vars4 : vars E2 D2 * Vars5 : D1 ++ D2 = V1 Vars2 : vars E1 D3 Vars6 : vars E2 D4 Vars7 : D3 ++ D4 = V2 ============================ V1 = V2
< apply IH to Vars3 Vars2. Subgoal 1.17: Variables: V1 V2 D2 E2 E1 D3 D4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (index E1 E2) V1 @ Vars3 : vars E1 D3 * Vars4 : vars E2 D2 * Vars5 : D3 ++ D2 = V1 Vars2 : vars E1 D3 Vars6 : vars E2 D4 Vars7 : D3 ++ D4 = V2 ============================ V1 = V2
< apply IH to Vars4 Vars6. Subgoal 1.17: Variables: V1 V2 E2 E1 D3 D4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (index E1 E2) V1 @ Vars3 : vars E1 D3 * Vars4 : vars E2 D4 * Vars5 : D3 ++ D4 = V1 Vars2 : vars E1 D3 Vars6 : vars E2 D4 Vars7 : D3 ++ D4 = V2 ============================ V1 = V2
< apply append_unique to Vars5 Vars7. Subgoal 1.17: Variables: V2 E2 E1 D3 D4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (index E1 E2) V2 @ Vars3 : vars E1 D3 * Vars4 : vars E2 D4 * Vars5 : D3 ++ D4 = V2 Vars2 : vars E1 D3 Vars6 : vars E2 D4 Vars7 : D3 ++ D4 = V2 ============================ V2 = V2
< search. Subgoal 1.18: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (simple_imp:list:length E1) V1 @ Vars2 : vars (simple_imp:list:length E1) V2 Vars3 : vars E1 V1 * ============================ V1 = V2
< Vars2: case Vars2. Subgoal 1.18: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (simple_imp:list:length E1) V1 @ Vars3 : vars E1 V1 * Vars2 : vars E1 V2 ============================ V1 = V2
< apply IH to Vars3 Vars2. Subgoal 1.18: Variables: V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2 Vars1 : vars (simple_imp:list:length E1) V2 @ Vars3 : vars E1 V2 * Vars2 : vars E1 V2 ============================ V2 = V2
< search. Proof completed.
< Prove_Constraint simple_imp:host:proj_e_vars_exist. Subgoal 1: Variables: V Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : vars (nil Ty) V ============================ exists V', vars (recBuild (addRecFieldExprs "null" true endRecFieldExprs)) V'
< search. Subgoal 2: Variables: V E2 E1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp1 : vars (cons E1 E2) V ============================ exists V', vars (recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)))) V'
< case Hyp1. Subgoal 2: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ exists V', vars (recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)))) V'
< exists V. Subgoal 2: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars (recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)))) V
< unfold . Subgoal 2: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars_rf (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) V
< unfold . Subgoal 2: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ exists DRest DE, vars_rf (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)) DRest /\ (vars false DE /\ DE ++ DRest = V)
< exists V, []. Subgoal 2: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars_rf (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)) V /\ (vars false [] /\ [] ++ V = V)
< split. Subgoal 2.1: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars_rf (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)) V
< unfold . Subgoal 2.1: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ exists DRest DE, vars_rf (addRecFieldExprs "tail" E2 endRecFieldExprs) DRest /\ (vars E1 DE /\ DE ++ DRest = V)
< exists D2, D1. Subgoal 2.1: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars_rf (addRecFieldExprs "tail" E2 endRecFieldExprs) D2 /\ (vars E1 D1 /\ D1 ++ D2 = V)
< split. Subgoal 2.1.1: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars_rf (addRecFieldExprs "tail" E2 endRecFieldExprs) D2
< unfold . Subgoal 2.1.1: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ exists DRest DE, vars_rf endRecFieldExprs DRest /\ (vars E2 DE /\ DE ++ DRest = D2)
< exists [], D2. Subgoal 2.1.1: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars_rf endRecFieldExprs [] /\ (vars E2 D2 /\ D2 ++ [] = D2)
< split. Subgoal 2.1.1.1: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars_rf endRecFieldExprs []
< search. Subgoal 2.1.1.2: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars E2 D2
< search. Subgoal 2.1.1.3: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ D2 ++ [] = D2
< apply vars_join to H2 with D = []. Subgoal 2.1.1.3: Variables: V E2 E1 D1 D2 D' Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V H4 : D2 ++ [] = D' ============================ D2 ++ [] = D2
< apply append_nil_right to H4. Subgoal 2.1.1.3: Variables: V E2 E1 D1 D' Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D' H3 : D1 ++ D' = V H4 : D' ++ [] = D' ============================ D' ++ [] = D'
< search. Subgoal 2.1.2: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars E1 D1
< search. Subgoal 2.1.3: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ D1 ++ D2 = V
< search. Subgoal 2.2: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ vars false []
< search. Subgoal 2.3: Variables: V E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) H1 : vars E1 D1 H2 : vars E2 D2 H3 : D1 ++ D2 = V ============================ [] ++ V = V
< search. Subgoal 3: Variables: E' V Hyp : |{e}- null E' ~~> E' Hyp1 : vars (null E') V ============================ exists V', vars E' V'
< case Hyp1. Subgoal 3: Variables: E' V Hyp : |{e}- null E' ~~> E' H1 : vars E' V ============================ exists V', vars E' V'
< search. Subgoal 4: Variables: E' V Hyp : |{e}- head E' ~~> E' Hyp1 : vars (head E') V ============================ exists V', vars E' V'
< case Hyp1. Subgoal 4: Variables: E' V Hyp : |{e}- head E' ~~> E' H1 : vars E' V ============================ exists V', vars E' V'
< search. Subgoal 5: Variables: E' V Hyp : |{e}- tail E' ~~> E' Hyp1 : vars (tail E') V ============================ exists V', vars E' V'
< case Hyp1. Subgoal 5: Variables: E' V Hyp : |{e}- tail E' ~~> E' H1 : vars E' V ============================ exists V', vars E' V'
< search. Subgoal 6: Variables: V Index Lst Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp1 : vars (index Lst Index) V ============================ exists V', vars (and (null Lst) (eq (num 0) Index)) V'
< Vars: case Hyp1. Subgoal 6: Variables: V Index Lst D1 D2 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Vars : vars Lst D1 Vars1 : vars Index D2 Vars2 : D1 ++ D2 = V ============================ exists V', vars (and (null Lst) (eq (num 0) Index)) V'
< search. Subgoal 7: Variables: E' V Hyp : |{e}- simple_imp:list:length E' ~~> E' Hyp1 : vars (simple_imp:list:length E') V ============================ exists V', vars E' V'
< case Hyp1. Subgoal 7: Variables: E' V Hyp : |{e}- simple_imp:list:length E' ~~> E' H1 : vars E' V ============================ exists V', vars E' V'
< search. Proof completed.
< Prove_Constraint simple_imp:host:proj_e_vars. Subgoal 1: Variables: V V' X Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : vars (nil Ty) V Hyp2 : vars (recBuild (addRecFieldExprs "null" true endRecFieldExprs)) V' Hyp3 : mem X V ============================ mem X V'
< case Hyp2. Subgoal 1: Variables: V V' X Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : vars (nil Ty) V Hyp3 : mem X V H1 : vars_rf (addRecFieldExprs "null" true endRecFieldExprs) V' ============================ mem X V'
< case H1. Subgoal 1: Variables: V V' X Ty DRest DE Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : vars (nil Ty) V Hyp3 : mem X V H2 : vars_rf endRecFieldExprs DRest H3 : vars true DE H4 : DE ++ DRest = V' ============================ mem X V'
< case H2. Subgoal 1: Variables: V V' X Ty DE Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : vars (nil Ty) V Hyp3 : mem X V H3 : vars true DE H4 : DE ++ [] = V' ============================ mem X V'
< case H3. Subgoal 1: Variables: V V' X Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : vars (nil Ty) V Hyp3 : mem X V H4 : [] ++ [] = V' ============================ mem X V'
< case H4. Subgoal 1: Variables: V X Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : vars (nil Ty) V Hyp3 : mem X V ============================ mem X []
< case Hyp1. Subgoal 1: Variables: X Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp3 : mem X [] ============================ mem X []
< search. Subgoal 2: Variables: V V' X E2 E1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp1 : vars (cons E1 E2) V Hyp2 : vars (recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)))) V' Hyp3 : mem X V ============================ mem X V'
< VarsCons: case Hyp1. Subgoal 2: Variables: V V' X E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp2 : vars (recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)))) V' Hyp3 : mem X V VarsCons : vars E1 D1 VarsCons1 : vars E2 D2 VarsCons2 : D1 ++ D2 = V ============================ mem X V'
< case Hyp2. Subgoal 2: Variables: V V' X E2 E1 D1 D2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 D1 VarsCons1 : vars E2 D2 VarsCons2 : D1 ++ D2 = V H1 : vars_rf (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) V' ============================ mem X V'
< case H1. Subgoal 2: Variables: V V' X E2 E1 D1 D2 DRest DE Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 D1 VarsCons1 : vars E2 D2 VarsCons2 : D1 ++ D2 = V H2 : vars_rf (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)) DRest H3 : vars false DE H4 : DE ++ DRest = V' ============================ mem X V'
< case H3. Subgoal 2: Variables: V V' X E2 E1 D1 D2 DRest Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 D1 VarsCons1 : vars E2 D2 VarsCons2 : D1 ++ D2 = V H2 : vars_rf (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)) DRest H4 : [] ++ DRest = V' ============================ mem X V'
< case H2. Subgoal 2: Variables: V V' X E2 E1 D1 D2 DRest DRest1 DE1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 D1 VarsCons1 : vars E2 D2 VarsCons2 : D1 ++ D2 = V H4 : [] ++ DRest = V' H5 : vars_rf (addRecFieldExprs "tail" E2 endRecFieldExprs) DRest1 H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = DRest ============================ mem X V'
< case H5. Subgoal 2: Variables: V V' X E2 E1 D1 D2 DRest DRest1 DE1 DRest2 DE2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 D1 VarsCons1 : vars E2 D2 VarsCons2 : D1 ++ D2 = V H4 : [] ++ DRest = V' H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = DRest H8 : vars_rf endRecFieldExprs DRest2 H9 : vars E2 DE2 H10 : DE2 ++ DRest2 = DRest1 ============================ mem X V'
< case H8. Subgoal 2: Variables: V V' X E2 E1 D1 D2 DRest DRest1 DE1 DE2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 D1 VarsCons1 : vars E2 D2 VarsCons2 : D1 ++ D2 = V H4 : [] ++ DRest = V' H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = DRest H9 : vars E2 DE2 H10 : DE2 ++ [] = DRest1 ============================ mem X V'
< apply vars_unique to VarsCons H6. Subgoal 2: Variables: V V' X E2 E1 D2 DRest DRest1 DE1 DE2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 DE1 VarsCons1 : vars E2 D2 VarsCons2 : DE1 ++ D2 = V H4 : [] ++ DRest = V' H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = DRest H9 : vars E2 DE2 H10 : DE2 ++ [] = DRest1 ============================ mem X V'
< apply vars_unique to VarsCons1 H9. Subgoal 2: Variables: V V' X E2 E1 DRest DRest1 DE1 DE2 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 DE1 VarsCons1 : vars E2 DE2 VarsCons2 : DE1 ++ DE2 = V H4 : [] ++ DRest = V' H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = DRest H9 : vars E2 DE2 H10 : DE2 ++ [] = DRest1 ============================ mem X V'
< apply append_nil_right to H10. Subgoal 2: Variables: V V' X E2 E1 DRest DRest1 DE1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 DE1 VarsCons1 : vars E2 DRest1 VarsCons2 : DE1 ++ DRest1 = V H4 : [] ++ DRest = V' H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = DRest H9 : vars E2 DRest1 H10 : DRest1 ++ [] = DRest1 ============================ mem X V'
< case H4. Subgoal 2: Variables: V V' X E2 E1 DRest1 DE1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 DE1 VarsCons1 : vars E2 DRest1 VarsCons2 : DE1 ++ DRest1 = V H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = V' H9 : vars E2 DRest1 H10 : DRest1 ++ [] = DRest1 ============================ mem X V'
< Or: apply mem_append to Hyp3 VarsCons2. Subgoal 2: Variables: V V' X E2 E1 DRest1 DE1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 DE1 VarsCons1 : vars E2 DRest1 VarsCons2 : DE1 ++ DRest1 = V H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = V' H9 : vars E2 DRest1 H10 : DRest1 ++ [] = DRest1 Or : mem X DE1 \/ mem X DRest1 ============================ mem X V'
< MemOr: case Or. Subgoal 2.1: Variables: V V' X E2 E1 DRest1 DE1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 DE1 VarsCons1 : vars E2 DRest1 VarsCons2 : DE1 ++ DRest1 = V H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = V' H9 : vars E2 DRest1 H10 : DRest1 ++ [] = DRest1 MemOr : mem X DE1 ============================ mem X V'
< apply mem_append_left to MemOr H7. Subgoal 2.1: Variables: V V' X E2 E1 DRest1 DE1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 DE1 VarsCons1 : vars E2 DRest1 VarsCons2 : DE1 ++ DRest1 = V H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = V' H9 : vars E2 DRest1 H10 : DRest1 ++ [] = DRest1 MemOr : mem X DE1 H11 : mem X V' ============================ mem X V'
< search. Subgoal 2.2: Variables: V V' X E2 E1 DRest1 DE1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 DE1 VarsCons1 : vars E2 DRest1 VarsCons2 : DE1 ++ DRest1 = V H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = V' H9 : vars E2 DRest1 H10 : DRest1 ++ [] = DRest1 MemOr : mem X DRest1 ============================ mem X V'
< apply mem_append_right to MemOr H7. Subgoal 2.2: Variables: V V' X E2 E1 DRest1 DE1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp3 : mem X V VarsCons : vars E1 DE1 VarsCons1 : vars E2 DRest1 VarsCons2 : DE1 ++ DRest1 = V H6 : vars E1 DE1 H7 : DE1 ++ DRest1 = V' H9 : vars E2 DRest1 H10 : DRest1 ++ [] = DRest1 MemOr : mem X DRest1 H11 : mem X V' ============================ mem X V'
< search. Subgoal 3: Variables: E' V V' X Hyp : |{e}- null E' ~~> E' Hyp1 : vars (null E') V Hyp2 : vars E' V' Hyp3 : mem X V ============================ mem X V'
< case Hyp1. Subgoal 3: Variables: E' V V' X Hyp : |{e}- null E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V H1 : vars E' V ============================ mem X V'
< apply vars_unique to H1 Hyp2. Subgoal 3: Variables: E' V' X Hyp : |{e}- null E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V' H1 : vars E' V' ============================ mem X V'
< search. Subgoal 4: Variables: E' V V' X Hyp : |{e}- head E' ~~> E' Hyp1 : vars (head E') V Hyp2 : vars E' V' Hyp3 : mem X V ============================ mem X V'
< case Hyp1. Subgoal 4: Variables: E' V V' X Hyp : |{e}- head E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V H1 : vars E' V ============================ mem X V'
< apply vars_unique to H1 Hyp2. Subgoal 4: Variables: E' V' X Hyp : |{e}- head E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V' H1 : vars E' V' ============================ mem X V'
< search. Subgoal 5: Variables: E' V V' X Hyp : |{e}- tail E' ~~> E' Hyp1 : vars (tail E') V Hyp2 : vars E' V' Hyp3 : mem X V ============================ mem X V'
< case Hyp1. Subgoal 5: Variables: E' V V' X Hyp : |{e}- tail E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V H1 : vars E' V ============================ mem X V'
< apply vars_unique to H1 Hyp2. Subgoal 5: Variables: E' V' X Hyp : |{e}- tail E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V' H1 : vars E' V' ============================ mem X V'
< search. Subgoal 6: Variables: V V' X Index Lst Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp1 : vars (index Lst Index) V Hyp2 : vars (and (null Lst) (eq (num 0) Index)) V' Hyp3 : mem X V ============================ mem X V'
< VI: case Hyp1. Subgoal 6: Variables: V V' X Index Lst D1 D2 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp2 : vars (and (null Lst) (eq (num 0) Index)) V' Hyp3 : mem X V VI : vars Lst D1 VI1 : vars Index D2 VI2 : D1 ++ D2 = V ============================ mem X V'
< VT: case Hyp2. Subgoal 6: Variables: V V' X Index Lst D1 D2 D3 D4 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp3 : mem X V VI : vars Lst D1 VI1 : vars Index D2 VI2 : D1 ++ D2 = V VT : vars (null Lst) D3 VT1 : vars (eq (num 0) Index) D4 VT2 : D3 ++ D4 = V' ============================ mem X V'
< VIdx2: case VT1. Subgoal 6: Variables: V V' X Index Lst D1 D2 D3 D4 D5 D6 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp3 : mem X V VI : vars Lst D1 VI1 : vars Index D2 VI2 : D1 ++ D2 = V VT : vars (null Lst) D3 VT2 : D3 ++ D4 = V' VIdx2 : vars (num 0) D5 VIdx1 : vars Index D6 VIdx3 : D5 ++ D6 = D4 ============================ mem X V'
< case VIdx2. Subgoal 6: Variables: V V' X Index Lst D1 D2 D3 D4 D6 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp3 : mem X V VI : vars Lst D1 VI1 : vars Index D2 VI2 : D1 ++ D2 = V VT : vars (null Lst) D3 VT2 : D3 ++ D4 = V' VIdx1 : vars Index D6 VIdx3 : [] ++ D6 = D4 ============================ mem X V'
< VLst2: case VT. Subgoal 6: Variables: V V' X Index Lst D1 D2 D3 D4 D6 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp3 : mem X V VI : vars Lst D1 VI1 : vars Index D2 VI2 : D1 ++ D2 = V VT2 : D3 ++ D4 = V' VIdx1 : vars Index D6 VIdx3 : [] ++ D6 = D4 VLst2 : vars Lst D3 ============================ mem X V'
< case VIdx3. Subgoal 6: Variables: V V' X Index Lst D1 D2 D3 D4 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp3 : mem X V VI : vars Lst D1 VI1 : vars Index D2 VI2 : D1 ++ D2 = V VT2 : D3 ++ D4 = V' VIdx1 : vars Index D4 VLst2 : vars Lst D3 ============================ mem X V'
< apply vars_unique to VI VLst2. Subgoal 6: Variables: V V' X Index Lst D2 D3 D4 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp3 : mem X V VI : vars Lst D3 VI1 : vars Index D2 VI2 : D3 ++ D2 = V VT2 : D3 ++ D4 = V' VIdx1 : vars Index D4 VLst2 : vars Lst D3 ============================ mem X V'
< apply vars_unique to VI1 VIdx1. Subgoal 6: Variables: V V' X Index Lst D3 D4 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp3 : mem X V VI : vars Lst D3 VI1 : vars Index D4 VI2 : D3 ++ D4 = V VT2 : D3 ++ D4 = V' VIdx1 : vars Index D4 VLst2 : vars Lst D3 ============================ mem X V'
< apply append_unique to VI2 VT2. Subgoal 6: Variables: V' X Index Lst D3 D4 Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp3 : mem X V' VI : vars Lst D3 VI1 : vars Index D4 VI2 : D3 ++ D4 = V' VT2 : D3 ++ D4 = V' VIdx1 : vars Index D4 VLst2 : vars Lst D3 ============================ mem X V'
< search. Subgoal 7: Variables: E' V V' X Hyp : |{e}- simple_imp:list:length E' ~~> E' Hyp1 : vars (simple_imp:list:length E') V Hyp2 : vars E' V' Hyp3 : mem X V ============================ mem X V'
< case Hyp1. Subgoal 7: Variables: E' V V' X Hyp : |{e}- simple_imp:list:length E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V H1 : vars E' V ============================ mem X V'
< apply vars_unique to Hyp2 H1. Subgoal 7: Variables: E' V X Hyp : |{e}- simple_imp:list:length E' ~~> E' Hyp2 : vars E' V Hyp3 : mem X V H1 : vars E' V ============================ mem X V
< search. Proof completed.
< Prove_Constraint simple_imp:host:proj_rf_vars_exist. Proof completed.
< Prove_Constraint simple_imp:host:proj_rf_vars. Proof completed.
< Prove simple_imp:host:vars_is, simple_imp:host:vars_rf_is. Subgoal 1.12: Variables: Ty IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V IsE : is_e (nil Ty) Vars : vars (nil Ty) [] @ ============================ is_list is_string []
< search. Subgoal 1.13: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V IsE : is_e (cons E1 E2) Vars : vars (cons E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V ============================ is_list is_string V
< IsE1: case IsE. Subgoal 1.13: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (cons E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V IsE1 : is_e E1 IsE2 : is_e E2 ============================ is_list is_string V
< IsD1: apply IH to IsE1 Vars1. Subgoal 1.13: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (cons E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V IsE1 : is_e E1 IsE2 : is_e E2 IsD1 : is_list is_string D1 ============================ is_list is_string V
< IsD2: apply IH to IsE2 Vars2. Subgoal 1.13: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (cons E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V IsE1 : is_e E1 IsE2 : is_e E2 IsD1 : is_list is_string D1 IsD2 : is_list is_string D2 ============================ is_list is_string V
< apply append__is_list__is_string to IsD1 IsD2 Vars3. Subgoal 1.13: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (cons E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V IsE1 : is_e E1 IsE2 : is_e E2 IsD1 : is_list is_string D1 IsD2 : is_list is_string D2 H1 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.14: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V IsE : is_e (null E1) Vars : vars (null E1) V @ Vars1 : vars E1 V * ============================ is_list is_string V
< IsE1: case IsE. Subgoal 1.14: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (null E1) V @ Vars1 : vars E1 V * IsE1 : is_e E1 ============================ is_list is_string V
< apply IH to IsE1 Vars1. Subgoal 1.14: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (null E1) V @ Vars1 : vars E1 V * IsE1 : is_e E1 H1 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.15: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V IsE : is_e (head E1) Vars : vars (head E1) V @ Vars1 : vars E1 V * ============================ is_list is_string V
< IsE1: case IsE. Subgoal 1.15: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (head E1) V @ Vars1 : vars E1 V * IsE1 : is_e E1 ============================ is_list is_string V
< apply IH to IsE1 Vars1. Subgoal 1.15: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (head E1) V @ Vars1 : vars E1 V * IsE1 : is_e E1 H1 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.16: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V IsE : is_e (tail E1) Vars : vars (tail E1) V @ Vars1 : vars E1 V * ============================ is_list is_string V
< IsE1: case IsE. Subgoal 1.16: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (tail E1) V @ Vars1 : vars E1 V * IsE1 : is_e E1 ============================ is_list is_string V
< apply IH to IsE1 Vars1. Subgoal 1.16: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (tail E1) V @ Vars1 : vars E1 V * IsE1 : is_e E1 H1 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.17: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V IsE : is_e (index E1 E2) Vars : vars (index E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V ============================ is_list is_string V
< IsE1: case IsE. Subgoal 1.17: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (index E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V IsE1 : is_e E1 IsE2 : is_e E2 ============================ is_list is_string V
< IsD1: apply IH to IsE1 Vars1. Subgoal 1.17: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (index E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V IsE1 : is_e E1 IsE2 : is_e E2 IsD1 : is_list is_string D1 ============================ is_list is_string V
< IsD2: apply IH to IsE2 Vars2. Subgoal 1.17: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (index E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V IsE1 : is_e E1 IsE2 : is_e E2 IsD1 : is_list is_string D1 IsD2 : is_list is_string D2 ============================ is_list is_string V
< apply append__is_list__is_string to IsD1 IsD2 Vars3. Subgoal 1.17: Variables: V D1 D2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (index E1 E2) V @ Vars1 : vars E1 D1 * Vars2 : vars E2 D2 * Vars3 : D1 ++ D2 = V IsE1 : is_e E1 IsE2 : is_e E2 IsD1 : is_list is_string D1 IsD2 : is_list is_string D2 H1 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 1.18: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V IsE : is_e (simple_imp:list:length E1) Vars : vars (simple_imp:list:length E1) V @ Vars1 : vars E1 V * ============================ is_list is_string V
< IsE1: case IsE. Subgoal 1.18: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (simple_imp:list:length E1) V @ Vars1 : vars E1 V * IsE1 : is_e E1 ============================ is_list is_string V
< apply IH to IsE1 Vars1. Subgoal 1.18: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V Vars : vars (simple_imp:list:length E1) V @ Vars1 : vars E1 V * IsE1 : is_e E1 H1 : is_list is_string V ============================ is_list is_string V
< search. Proof completed.
< Prove simple_imp:host:vars_exist, simple_imp:host:vars_rf_exist. Subgoal 1.12: Variables: Ty IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (nil Ty) @ IsE1 : is_ty Ty ============================ exists V, vars (nil Ty) V
< search. Subgoal 1.13: Variables: E2 E1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ exists V, vars (cons E1 E2) V
< Vars1: apply IH to IsE1. Subgoal 1.13: Variables: E2 E1 V IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V ============================ exists V, vars (cons E1 E2) V
< Vars2: apply IH to IsE2. Subgoal 1.13: Variables: E2 E1 V V1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V Vars2 : vars E2 V1 ============================ exists V, vars (cons E1 E2) V
< IsV: apply vars_is to IsE1 Vars1. Subgoal 1.13: Variables: E2 E1 V V1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V Vars2 : vars E2 V1 IsV : is_list is_string V ============================ exists V, vars (cons E1 E2) V
< IsV1: apply vars_is to IsE2 Vars2. Subgoal 1.13: Variables: E2 E1 V V1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V Vars2 : vars E2 V1 IsV : is_list is_string V IsV1 : is_list is_string V1 ============================ exists V, vars (cons E1 E2) V
< apply append__is_list__is_string__total to IsV IsV1. Subgoal 1.13: Variables: E2 E1 V V1 L IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V Vars2 : vars E2 V1 IsV : is_list is_string V IsV1 : is_list is_string V1 H1 : V ++ V1 = L ============================ exists V, vars (cons E1 E2) V
< search. Subgoal 1.14: Variables: E1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ exists V, vars (null E1) V
< apply IH to IsE1. Subgoal 1.14: Variables: E1 V IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (null E1) @ IsE1 : is_e E1 * H1 : vars E1 V ============================ exists V, vars (null E1) V
< search. Subgoal 1.15: Variables: E1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ exists V, vars (head E1) V
< apply IH to IsE1. Subgoal 1.15: Variables: E1 V IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (head E1) @ IsE1 : is_e E1 * H1 : vars E1 V ============================ exists V, vars (head E1) V
< search. Subgoal 1.16: Variables: E1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ exists V, vars (tail E1) V
< apply IH to IsE1. Subgoal 1.16: Variables: E1 V IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (tail E1) @ IsE1 : is_e E1 * H1 : vars E1 V ============================ exists V, vars (tail E1) V
< search. Subgoal 1.17: Variables: E2 E1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (index E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ exists V, vars (index E1 E2) V
< Vars1: apply IH to IsE1. Subgoal 1.17: Variables: E2 E1 V IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (index E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V ============================ exists V, vars (index E1 E2) V
< Vars2: apply IH to IsE2. Subgoal 1.17: Variables: E2 E1 V V1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (index E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V Vars2 : vars E2 V1 ============================ exists V, vars (index E1 E2) V
< IsV: apply vars_is to IsE1 Vars1. Subgoal 1.17: Variables: E2 E1 V V1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (index E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V Vars2 : vars E2 V1 IsV : is_list is_string V ============================ exists V, vars (index E1 E2) V
< IsV1: apply vars_is to IsE2 Vars2. Subgoal 1.17: Variables: E2 E1 V V1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (index E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V Vars2 : vars E2 V1 IsV : is_list is_string V IsV1 : is_list is_string V1 ============================ exists V, vars (index E1 E2) V
< apply append__is_list__is_string__total to IsV IsV1. Subgoal 1.17: Variables: E2 E1 V V1 L IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (index E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * Vars1 : vars E1 V Vars2 : vars E2 V1 IsV : is_list is_string V IsV1 : is_list is_string V1 H1 : V ++ V1 = L ============================ exists V, vars (index E1 E2) V
< search. Subgoal 1.18: Variables: E1 IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (simple_imp:list:length E1) @ IsE1 : is_e E1 * ============================ exists V, vars (simple_imp:list:length E1) V
< apply IH to IsE1. Subgoal 1.18: Variables: E1 V IH : forall E, is_e E * -> exists V, vars E V IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V IsE : is_e (simple_imp:list:length E1) @ IsE1 : is_e E1 * H1 : vars E1 V ============================ exists V, vars (simple_imp:list:length E1) V
< search. Proof completed.
< Prove simple_imp:host:typeOf_unique, simple_imp:host:typeRecFields_unique. Subgoal 1.12: Variables: G T2 Ty IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (nil Ty) (listTy Ty) @ Ty2 : typeOf G (nil Ty) T2 ============================ listTy Ty = T2
< Ty2: case Ty2. Subgoal 1.12: Variables: G Ty IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (nil Ty) (listTy Ty) @ ============================ listTy Ty = listTy Ty
< search. Subgoal 1.13: Variables: G T2 Ty E2 E1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (cons E1 E2) (listTy Ty) @ Ty2 : typeOf G (cons E1 E2) T2 Ty3 : typeOf G E1 Ty * Ty4 : typeOf G E2 (listTy Ty) * ============================ listTy Ty = T2
< Ty2: case Ty2. Subgoal 1.13: Variables: G Ty E2 E1 Ty1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (cons E1 E2) (listTy Ty) @ Ty3 : typeOf G E1 Ty * Ty4 : typeOf G E2 (listTy Ty) * Ty2 : typeOf G E1 Ty1 Ty5 : typeOf G E2 (listTy Ty1) ============================ listTy Ty = listTy Ty1
< apply IH to Ty3 Ty2. Subgoal 1.13: Variables: G E2 E1 Ty1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (cons E1 E2) (listTy Ty1) @ Ty3 : typeOf G E1 Ty1 * Ty4 : typeOf G E2 (listTy Ty1) * Ty2 : typeOf G E1 Ty1 Ty5 : typeOf G E2 (listTy Ty1) ============================ listTy Ty1 = listTy Ty1
< apply IH to Ty4 Ty5. Subgoal 1.13: Variables: G E2 E1 Ty1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (cons E1 E2) (listTy Ty1) @ Ty3 : typeOf G E1 Ty1 * Ty4 : typeOf G E2 (listTy Ty1) * Ty2 : typeOf G E1 Ty1 Ty5 : typeOf G E2 (listTy Ty1) ============================ listTy Ty1 = listTy Ty1
< search. Subgoal 1.14: Variables: G T2 Ty E1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (null E1) boolTy @ Ty2 : typeOf G (null E1) T2 Ty3 : typeOf G E1 (listTy Ty) * ============================ boolTy = T2
< Ty2: case Ty2. Subgoal 1.14: Variables: G Ty E1 Ty1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (null E1) boolTy @ Ty3 : typeOf G E1 (listTy Ty) * Ty2 : typeOf G E1 (listTy Ty1) ============================ boolTy = boolTy
< search. Subgoal 1.15: Variables: G T1 T2 E1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (head E1) T1 @ Ty2 : typeOf G (head E1) T2 Ty3 : typeOf G E1 (listTy T1) * ============================ T1 = T2
< Ty2: case Ty2. Subgoal 1.15: Variables: G T1 T2 E1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (head E1) T1 @ Ty3 : typeOf G E1 (listTy T1) * Ty2 : typeOf G E1 (listTy T2) ============================ T1 = T2
< apply IH to Ty3 Ty2. Subgoal 1.15: Variables: G T2 E1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (head E1) T2 @ Ty3 : typeOf G E1 (listTy T2) * Ty2 : typeOf G E1 (listTy T2) ============================ T2 = T2
< search. Subgoal 1.16: Variables: G T2 Ty E1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (tail E1) (listTy Ty) @ Ty2 : typeOf G (tail E1) T2 Ty3 : typeOf G E1 (listTy Ty) * ============================ listTy Ty = T2
< Ty2: case Ty2. Subgoal 1.16: Variables: G Ty E1 Ty1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (tail E1) (listTy Ty) @ Ty3 : typeOf G E1 (listTy Ty) * Ty2 : typeOf G E1 (listTy Ty1) ============================ listTy Ty = listTy Ty1
< apply IH to Ty3 Ty2. Subgoal 1.16: Variables: G E1 Ty1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (tail E1) (listTy Ty1) @ Ty3 : typeOf G E1 (listTy Ty1) * Ty2 : typeOf G E1 (listTy Ty1) ============================ listTy Ty1 = listTy Ty1
< search. Subgoal 1.17: Variables: G T1 T2 Index List IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (index List Index) T1 @ Ty2 : typeOf G (index List Index) T2 Ty3 : typeOf G List (listTy T1) * Ty4 : typeOf G Index intTy * ============================ T1 = T2
< Ty2: case Ty2. Subgoal 1.17: Variables: G T1 T2 Index List IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (index List Index) T1 @ Ty3 : typeOf G List (listTy T1) * Ty4 : typeOf G Index intTy * Ty2 : typeOf G List (listTy T2) Ty5 : typeOf G Index intTy ============================ T1 = T2
< apply IH to Ty3 Ty2. Subgoal 1.17: Variables: G T2 Index List IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (index List Index) T2 @ Ty3 : typeOf G List (listTy T2) * Ty4 : typeOf G Index intTy * Ty2 : typeOf G List (listTy T2) Ty5 : typeOf G Index intTy ============================ T2 = T2
< search. Subgoal 1.18: Variables: G T2 Ty Lst IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (simple_imp:list:length Lst) intTy @ Ty2 : typeOf G (simple_imp:list:length Lst) T2 Ty3 : typeOf G Lst (listTy Ty) * ============================ intTy = T2
< Ty2: case Ty2. Subgoal 1.18: Variables: G Ty Lst Ty1 IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2 IH1 : forall G RF T1 T2, typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2 Ty1 : typeOf G (simple_imp:list:length Lst) intTy @ Ty3 : typeOf G Lst (listTy Ty) * Ty2 : typeOf G Lst (listTy Ty1) ============================ intTy = intTy
< search. Proof completed.
< Prove simple_imp:host:typeOK_unique. Proof completed.
< Prove_Constraint simple_imp:host:proj_eval_e. Subgoal 1: Variables: G V Ty Hyp : |{e}- nil Ty ~~> recBuild (addRecFieldExprs "null" true endRecFieldExprs) Hyp1 : eval_e G (nil Ty) V ============================ exists V', eval_e G (recBuild (addRecFieldExprs "null" true endRecFieldExprs)) V'
< search. Subgoal 2: Variables: G V E2 E1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Hyp1 : eval_e G (cons E1 E2) V ============================ exists V', eval_e G (recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)))) V'
< Ev: case Hyp1. Subgoal 2: Variables: G E2 E1 V2 V1 Hyp : |{e}- cons E1 E2 ~~> recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs))) Ev : eval_e G E1 V1 Ev1 : eval_e G E2 V2 ============================ exists V', eval_e G (recBuild (addRecFieldExprs "null" false (addRecFieldExprs "head" E1 (addRecFieldExprs "tail" E2 endRecFieldExprs)))) V'
< search. Subgoal 3: Variables: G E' V Hyp : |{e}- null E' ~~> E' Hyp1 : eval_e G (null E') V ============================ exists V', eval_e G E' V'
< case Hyp1. Subgoal 3.1: Variables: G E' Hyp : |{e}- null E' ~~> E' H1 : eval_e G E' nilVal ============================ exists V', eval_e G E' V'
< search. Subgoal 3.2: Variables: G E' V1 V2 Hyp : |{e}- null E' ~~> E' H1 : eval_e G E' (consVal V1 V2) ============================ exists V', eval_e G E' V'
< search. Subgoal 4: Variables: G E' V Hyp : |{e}- head E' ~~> E' Hyp1 : eval_e G (head E') V ============================ exists V', eval_e G E' V'
< case Hyp1. Subgoal 4: Variables: G E' V V2 Hyp : |{e}- head E' ~~> E' H1 : eval_e G E' (consVal V V2) ============================ exists V', eval_e G E' V'
< search. Subgoal 5: Variables: G E' V Hyp : |{e}- tail E' ~~> E' Hyp1 : eval_e G (tail E') V ============================ exists V', eval_e G E' V'
< case Hyp1. Subgoal 5: Variables: G E' V V1 Hyp : |{e}- tail E' ~~> E' H1 : eval_e G E' (consVal V1 V) ============================ exists V', eval_e G E' V'
< search. Subgoal 6: Variables: G V Index Lst Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Hyp1 : eval_e G (index Lst Index) V ============================ exists V', eval_e G (and (null Lst) (eq (num 0) Index)) V'
< Ev: case Hyp1. Subgoal 6: Variables: G V Index Lst Hd Tl I Hyp : |{e}- index Lst Index ~~> and (null Lst) (eq (num 0) Index) Ev : eval_e G Lst (consVal Hd Tl) Ev1 : eval_e G Index (intVal I) Ev2 : indexRel (consVal Hd Tl) I V ============================ exists V', eval_e G (and (null Lst) (eq (num 0) Index)) V'
< search. Subgoal 7: Variables: G E' V Hyp : |{e}- simple_imp:list:length E' ~~> E' Hyp1 : eval_e G (simple_imp:list:length E') V ============================ exists V', eval_e G E' V'
< Ev: case Hyp1. Subgoal 7: Variables: G E' ListVal Length Hyp : |{e}- simple_imp:list:length E' ~~> E' Ev : eval_e G E' ListVal Ev1 : lengthRel ListVal Length ============================ exists V', eval_e G E' V'
< search. Proof completed.
< Extensible_Theorem index_is_integer : forall L I V, Index : indexRel L I V -> is_integer I on Index. Subgoal 1: Variables: V Tl IH : forall L I V, indexRel L I V * -> is_integer I Index : indexRel (consVal V Tl) 0 V @ ============================ is_integer 0
< search. Subgoal 2: Variables: I V SubIndex Tl Hd IH : forall L I V, indexRel L I V * -> is_integer I Index : indexRel (consVal Hd Tl) I V @ Index1 : I - 1 = SubIndex Index2 : indexRel Tl SubIndex V * ============================ is_integer I
< IsSubIndex: apply IH to Index2. Subgoal 2: Variables: I V SubIndex Tl Hd IH : forall L I V, indexRel L I V * -> is_integer I Index : indexRel (consVal Hd Tl) I V @ Index1 : I - 1 = SubIndex Index2 : indexRel Tl SubIndex V * IsSubIndex : is_integer SubIndex ============================ is_integer I
< Is: apply minus_integer_is_integer_result to IsSubIndex Index1. Subgoal 2: Variables: I V SubIndex Tl Hd IH : forall L I V, indexRel L I V * -> is_integer I Index : indexRel (consVal Hd Tl) I V @ Index1 : I - 1 = SubIndex Index2 : indexRel Tl SubIndex V * IsSubIndex : is_integer SubIndex Is : is_integer I Is1 : is_integer 1 ============================ is_integer I
< search. Subgoal 3: Variables: I V VT IH : forall L I V, indexRel L I V * -> is_integer I Index : indexRel <unknown I value> I V @ Index1 : |{value}- <unknown I value> ~~> VT Index2 : indexRel VT I V * ============================ is_integer I
< backchain IH. Proof completed.
< Extensible_Theorem index_negative_false : forall L I V, Index : indexRel L I V -> Neg : I < 0 -> false on Index. Subgoal 1: Variables: V Tl IH : forall L I V, indexRel L I V * -> I < 0 -> false Index : indexRel (consVal V Tl) 0 V @ Neg : 0 < 0 ============================ false
< case Neg. Subgoal 2: Variables: I V SubIndex Tl Hd IH : forall L I V, indexRel L I V * -> I < 0 -> false Index : indexRel (consVal Hd Tl) I V @ Neg : I < 0 Index1 : I - 1 = SubIndex Index2 : indexRel Tl SubIndex V * ============================ false
< apply index_is_integer to Index. Subgoal 2: Variables: I V SubIndex Tl Hd IH : forall L I V, indexRel L I V * -> I < 0 -> false Index : indexRel (consVal Hd Tl) I V @ Neg : I < 0 Index1 : I - 1 = SubIndex Index2 : indexRel Tl SubIndex V * H1 : is_integer I ============================ false
< apply less_integer__subtract_positive to _ _ Neg _ Index1. Subgoal 2: Variables: I V SubIndex Tl Hd IH : forall L I V, indexRel L I V * -> I < 0 -> false Index : indexRel (consVal Hd Tl) I V @ Neg : I < 0 Index1 : I - 1 = SubIndex Index2 : indexRel Tl SubIndex V * H1 : is_integer I H2 : SubIndex < 0 ============================ false
< apply minus_integer_is_integer to _ _ Index1. Subgoal 2: Variables: I V SubIndex Tl Hd IH : forall L I V, indexRel L I V * -> I < 0 -> false Index : indexRel (consVal Hd Tl) I V @ Neg : I < 0 Index1 : I - 1 = SubIndex Index2 : indexRel Tl SubIndex V * H1 : is_integer I H2 : SubIndex < 0 H3 : is_integer SubIndex ============================ false
< apply IH to Index2 _. Subgoal 3: Variables: I V VT IH : forall L I V, indexRel L I V * -> I < 0 -> false Index : indexRel <unknown I value> I V @ Neg : I < 0 Index1 : |{value}- <unknown I value> ~~> VT Index2 : indexRel VT I V * ============================ false
< apply IH to Index2 Neg. Proof completed.
< Extensible_Theorem index_unique : forall L I V1 V2, Index1 : indexRel L I V1 -> Index2 : indexRel L I V2 -> V1 = V2 on Index1. Subgoal 1: Variables: V1 V2 Tl IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal V1 Tl) 0 V1 @ Index2 : indexRel (consVal V1 Tl) 0 V2 ============================ V1 = V2
< Index2: case Index2. Subgoal 1.1: Variables: V2 Tl IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal V2 Tl) 0 V2 @ ============================ V2 = V2
< search. Subgoal 1.2: Variables: V1 V2 Tl SubIndex IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal V1 Tl) 0 V1 @ Index2 : 0 - 1 = SubIndex Index3 : indexRel Tl SubIndex V2 ============================ V1 = V2
< case Index2. Subgoal 1.2: Variables: V1 V2 Tl SubIndex IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal V1 Tl) 0 V1 @ Index3 : indexRel Tl SubIndex V2 H1 : 0 + -1 = SubIndex ============================ V1 = V2
< case H1. Subgoal 1.2: Variables: V1 V2 Tl IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal V1 Tl) 0 V1 @ Index3 : indexRel Tl -1 V2 ============================ V1 = V2
< apply index_negative_false to Index3 _. Subgoal 2: Variables: I V1 V2 SubIndex Tl Hd IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal Hd Tl) I V1 @ Index2 : indexRel (consVal Hd Tl) I V2 Index3 : I - 1 = SubIndex Index4 : indexRel Tl SubIndex V1 * ============================ V1 = V2
< Index2: case Index2. Subgoal 2.1: Variables: V1 V2 SubIndex Tl IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal V2 Tl) 0 V1 @ Index3 : 0 - 1 = SubIndex Index4 : indexRel Tl SubIndex V1 * ============================ V1 = V2
< case Index3. Subgoal 2.1: Variables: V1 V2 SubIndex Tl IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal V2 Tl) 0 V1 @ Index4 : indexRel Tl SubIndex V1 * H1 : 0 + -1 = SubIndex ============================ V1 = V2
< case H1. Subgoal 2.1: Variables: V1 V2 Tl IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal V2 Tl) 0 V1 @ Index4 : indexRel Tl -1 V1 * ============================ V1 = V2
< apply index_negative_false to Index4 _. Subgoal 2.2: Variables: I V1 V2 SubIndex Tl Hd SubIndex1 IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal Hd Tl) I V1 @ Index3 : I - 1 = SubIndex Index4 : indexRel Tl SubIndex V1 * Index2 : I - 1 = SubIndex1 Index5 : indexRel Tl SubIndex1 V2 ============================ V1 = V2
< apply minus_integer_unique to Index3 Index2. Subgoal 2.2: Variables: I V1 V2 Tl Hd SubIndex1 IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal Hd Tl) I V1 @ Index3 : I - 1 = SubIndex1 Index4 : indexRel Tl SubIndex1 V1 * Index2 : I - 1 = SubIndex1 Index5 : indexRel Tl SubIndex1 V2 ============================ V1 = V2
< apply IH to Index4 Index5. Subgoal 2.2: Variables: I V2 Tl Hd SubIndex1 IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel (consVal Hd Tl) I V2 @ Index3 : I - 1 = SubIndex1 Index4 : indexRel Tl SubIndex1 V2 * Index2 : I - 1 = SubIndex1 Index5 : indexRel Tl SubIndex1 V2 ============================ V2 = V2
< search. Subgoal 3: Variables: I V1 V2 VT IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel <unknown I value> I V1 @ Index2 : indexRel <unknown I value> I V2 Index3 : |{value}- <unknown I value> ~~> VT Index4 : indexRel VT I V1 * ============================ V1 = V2
< Index2: case Index2. Subgoal 3: Variables: I V1 V2 VT VT1 IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel <unknown I value> I V1 @ Index3 : |{value}- <unknown I value> ~~> VT Index4 : indexRel VT I V1 * Index2 : |{value}- <unknown I value> ~~> VT1 Index5 : indexRel VT1 I V2 ============================ V1 = V2
< apply proj_value_unique to Index3 Index2. Subgoal 3: Variables: I V1 V2 VT1 IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel <unknown I value> I V1 @ Index3 : |{value}- <unknown I value> ~~> VT1 Index4 : indexRel VT1 I V1 * Index2 : |{value}- <unknown I value> ~~> VT1 Index5 : indexRel VT1 I V2 ============================ V1 = V2
< apply IH to Index4 Index5. Subgoal 3: Variables: I V2 VT1 IH : forall L I V1 V2, indexRel L I V1 * -> indexRel L I V2 -> V1 = V2 Index1 : indexRel <unknown I value> I V2 @ Index3 : |{value}- <unknown I value> ~~> VT1 Index4 : indexRel VT1 I V2 * Index2 : |{value}- <unknown I value> ~~> VT1 Index5 : indexRel VT1 I V2 ============================ V2 = V2
< search. Proof completed.
< Extensible_Theorem length_is_integer : forall L V, Len : lengthRel L V -> is_integer V on Len. Subgoal 1: IH : forall L V, lengthRel L V * -> is_integer V Len : lengthRel nilVal 0 @ ============================ is_integer 0
< search. Subgoal 2: Variables: V SubLen Tl Hd IH : forall L V, lengthRel L V * -> is_integer V Len : lengthRel (consVal Hd Tl) V @ Len1 : lengthRel Tl SubLen * Len2 : SubLen + 1 = V ============================ is_integer V
< IsSubLen: apply IH to Len1. Subgoal 2: Variables: V SubLen Tl Hd IH : forall L V, lengthRel L V * -> is_integer V Len : lengthRel (consVal Hd Tl) V @ Len1 : lengthRel Tl SubLen * Len2 : SubLen + 1 = V IsSubLen : is_integer SubLen ============================ is_integer V
< apply plus_integer_is_integer to _ _ Len2. Subgoal 2: Variables: V SubLen Tl Hd IH : forall L V, lengthRel L V * -> is_integer V Len : lengthRel (consVal Hd Tl) V @ Len1 : lengthRel Tl SubLen * Len2 : SubLen + 1 = V IsSubLen : is_integer SubLen H1 : is_integer V ============================ is_integer V
< search. Subgoal 3: Variables: V VT IH : forall L V, lengthRel L V * -> is_integer V Len : lengthRel <unknown I value> V @ Len1 : |{value}- <unknown I value> ~~> VT Len2 : lengthRel VT V * ============================ is_integer V
< apply IH to Len2. Subgoal 3: Variables: V VT IH : forall L V, lengthRel L V * -> is_integer V Len : lengthRel <unknown I value> V @ Len1 : |{value}- <unknown I value> ~~> VT Len2 : lengthRel VT V * H1 : is_integer V ============================ is_integer V
< search. Proof completed.
< Extensible_Theorem length_unique : forall L V1 V2, Len1 : lengthRel L V1 -> Len2 : lengthRel L V2 -> V1 = V2 on Len1. Subgoal 1: Variables: V2 IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel nilVal 0 @ Len2 : lengthRel nilVal V2 ============================ 0 = V2
< case Len2. Subgoal 1: IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel nilVal 0 @ ============================ 0 = 0
< search. Subgoal 2: Variables: V1 V2 SubLen Tl Hd IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel (consVal Hd Tl) V1 @ Len2 : lengthRel (consVal Hd Tl) V2 Len3 : lengthRel Tl SubLen * Len4 : SubLen + 1 = V1 ============================ V1 = V2
< Len2: case Len2. Subgoal 2: Variables: V1 V2 SubLen Tl Hd SubLen1 IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel (consVal Hd Tl) V1 @ Len3 : lengthRel Tl SubLen * Len4 : SubLen + 1 = V1 Len2 : lengthRel Tl SubLen1 Len5 : SubLen1 + 1 = V2 ============================ V1 = V2
< apply IH to Len3 Len2. Subgoal 2: Variables: V1 V2 Tl Hd SubLen1 IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel (consVal Hd Tl) V1 @ Len3 : lengthRel Tl SubLen1 * Len4 : SubLen1 + 1 = V1 Len2 : lengthRel Tl SubLen1 Len5 : SubLen1 + 1 = V2 ============================ V1 = V2
< apply plus_integer_unique to Len4 Len5. Subgoal 2: Variables: V2 Tl Hd SubLen1 IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel (consVal Hd Tl) V2 @ Len3 : lengthRel Tl SubLen1 * Len4 : SubLen1 + 1 = V2 Len2 : lengthRel Tl SubLen1 Len5 : SubLen1 + 1 = V2 ============================ V2 = V2
< search. Subgoal 3: Variables: V1 V2 VT IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel <unknown I value> V1 @ Len2 : lengthRel <unknown I value> V2 Len3 : |{value}- <unknown I value> ~~> VT Len4 : lengthRel VT V1 * ============================ V1 = V2
< Len2: case Len2. Subgoal 3: Variables: V1 V2 VT VT1 IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel <unknown I value> V1 @ Len3 : |{value}- <unknown I value> ~~> VT Len4 : lengthRel VT V1 * Len2 : |{value}- <unknown I value> ~~> VT1 Len5 : lengthRel VT1 V2 ============================ V1 = V2
< apply proj_value_unique to Len3 Len2. Subgoal 3: Variables: V1 V2 VT1 IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel <unknown I value> V1 @ Len3 : |{value}- <unknown I value> ~~> VT1 Len4 : lengthRel VT1 V1 * Len2 : |{value}- <unknown I value> ~~> VT1 Len5 : lengthRel VT1 V2 ============================ V1 = V2
< apply IH to Len4 Len5. Subgoal 3: Variables: V2 VT1 IH : forall L V1 V2, lengthRel L V1 * -> lengthRel L V2 -> V1 = V2 Len1 : lengthRel <unknown I value> V2 @ Len3 : |{value}- <unknown I value> ~~> VT1 Len4 : lengthRel VT1 V2 * Len2 : |{value}- <unknown I value> ~~> VT1 Len5 : lengthRel VT1 V2 ============================ V2 = V2
< search. Proof completed.
< Prove simple_imp:host:eval_e_unique, simple_imp:host:eval_rf_unique. Subgoal 1.18: Variables: G V2 Ty IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (nil Ty) nilVal @ Ev2 : eval_e G (nil Ty) V2 ============================ nilVal = V2
< case Ev2. Subgoal 1.18: Variables: G Ty IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (nil Ty) nilVal @ ============================ nilVal = nilVal
< search. Subgoal 1.19: Variables: G V2 V4 V3 E2 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (cons E1 E2) (consVal V3 V4) @ Ev2 : eval_e G (cons E1 E2) V2 Ev3 : eval_e G E1 V3 * Ev4 : eval_e G E2 V4 * ============================ consVal V3 V4 = V2
< Ev2: case Ev2. Subgoal 1.19: Variables: G V4 V3 E2 E1 V6 V5 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (cons E1 E2) (consVal V3 V4) @ Ev3 : eval_e G E1 V3 * Ev4 : eval_e G E2 V4 * Ev2 : eval_e G E1 V5 Ev5 : eval_e G E2 V6 ============================ consVal V3 V4 = consVal V5 V6
< apply IH to Ev3 Ev2. Subgoal 1.19: Variables: G V4 E2 E1 V6 V5 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (cons E1 E2) (consVal V5 V4) @ Ev3 : eval_e G E1 V5 * Ev4 : eval_e G E2 V4 * Ev2 : eval_e G E1 V5 Ev5 : eval_e G E2 V6 ============================ consVal V5 V4 = consVal V5 V6
< apply IH to Ev4 Ev5. Subgoal 1.19: Variables: G E2 E1 V6 V5 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (cons E1 E2) (consVal V5 V6) @ Ev3 : eval_e G E1 V5 * Ev4 : eval_e G E2 V6 * Ev2 : eval_e G E1 V5 Ev5 : eval_e G E2 V6 ============================ consVal V5 V6 = consVal V5 V6
< search. Subgoal 1.20: Variables: G V2 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (null E1) trueVal @ Ev2 : eval_e G (null E1) V2 Ev3 : eval_e G E1 nilVal * ============================ trueVal = V2
< Ev2: case Ev2. Subgoal 1.20.1: Variables: G E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (null E1) trueVal @ Ev3 : eval_e G E1 nilVal * Ev2 : eval_e G E1 nilVal ============================ trueVal = trueVal
< search. Subgoal 1.20.2: Variables: G E1 V3 V4 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (null E1) trueVal @ Ev3 : eval_e G E1 nilVal * Ev2 : eval_e G E1 (consVal V3 V4) ============================ trueVal = falseVal
< apply IH to Ev3 Ev2. Subgoal 1.21: Variables: G V2 V3 V4 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (null E1) falseVal @ Ev2 : eval_e G (null E1) V2 Ev3 : eval_e G E1 (consVal V3 V4) * ============================ falseVal = V2
< Ev2: case Ev2. Subgoal 1.21.1: Variables: G V3 V4 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (null E1) falseVal @ Ev3 : eval_e G E1 (consVal V3 V4) * Ev2 : eval_e G E1 nilVal ============================ falseVal = trueVal
< apply IH to Ev3 Ev2. Subgoal 1.21.2: Variables: G V3 V4 E1 V5 V6 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (null E1) falseVal @ Ev3 : eval_e G E1 (consVal V3 V4) * Ev2 : eval_e G E1 (consVal V5 V6) ============================ falseVal = falseVal
< search. Subgoal 1.22: Variables: G V1 V2 V3 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (head E1) V1 @ Ev2 : eval_e G (head E1) V2 Ev3 : eval_e G E1 (consVal V1 V3) * ============================ V1 = V2
< Ev2: case Ev2. Subgoal 1.22: Variables: G V1 V2 V3 E1 V4 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (head E1) V1 @ Ev3 : eval_e G E1 (consVal V1 V3) * Ev2 : eval_e G E1 (consVal V2 V4) ============================ V1 = V2
< apply IH to Ev3 Ev2. Subgoal 1.22: Variables: G V2 E1 V4 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (head E1) V2 @ Ev3 : eval_e G E1 (consVal V2 V4) * Ev2 : eval_e G E1 (consVal V2 V4) ============================ V2 = V2
< search. Subgoal 1.23: Variables: G V1 V2 V3 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (tail E1) V1 @ Ev2 : eval_e G (tail E1) V2 Ev3 : eval_e G E1 (consVal V3 V1) * ============================ V1 = V2
< Ev2: case Ev2. Subgoal 1.23: Variables: G V1 V2 V3 E1 V4 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (tail E1) V1 @ Ev3 : eval_e G E1 (consVal V3 V1) * Ev2 : eval_e G E1 (consVal V4 V2) ============================ V1 = V2
< apply IH to Ev3 Ev2. Subgoal 1.23: Variables: G V2 E1 V4 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (tail E1) V2 @ Ev3 : eval_e G E1 (consVal V4 V2) * Ev2 : eval_e G E1 (consVal V4 V2) ============================ V2 = V2
< search. Subgoal 1.24: Variables: G V1 V2 Hd Tl I E2 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (index E1 E2) V1 @ Ev2 : eval_e G (index E1 E2) V2 Ev3 : eval_e G E1 (consVal Hd Tl) * Ev4 : eval_e G E2 (intVal I) * Ev5 : indexRel (consVal Hd Tl) I V1 ============================ V1 = V2
< Ev2: case Ev2. Subgoal 1.24: Variables: G V1 V2 Hd Tl I E2 E1 Hd1 Tl1 I1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (index E1 E2) V1 @ Ev3 : eval_e G E1 (consVal Hd Tl) * Ev4 : eval_e G E2 (intVal I) * Ev5 : indexRel (consVal Hd Tl) I V1 Ev2 : eval_e G E1 (consVal Hd1 Tl1) Ev6 : eval_e G E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 ============================ V1 = V2
< apply IH to Ev3 Ev2. Subgoal 1.24: Variables: G V1 V2 I E2 E1 Hd1 Tl1 I1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (index E1 E2) V1 @ Ev3 : eval_e G E1 (consVal Hd1 Tl1) * Ev4 : eval_e G E2 (intVal I) * Ev5 : indexRel (consVal Hd1 Tl1) I V1 Ev2 : eval_e G E1 (consVal Hd1 Tl1) Ev6 : eval_e G E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 ============================ V1 = V2
< apply IH to Ev4 Ev6. Subgoal 1.24: Variables: G V1 V2 E2 E1 Hd1 Tl1 I1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (index E1 E2) V1 @ Ev3 : eval_e G E1 (consVal Hd1 Tl1) * Ev4 : eval_e G E2 (intVal I1) * Ev5 : indexRel (consVal Hd1 Tl1) I1 V1 Ev2 : eval_e G E1 (consVal Hd1 Tl1) Ev6 : eval_e G E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 ============================ V1 = V2
< apply index_unique to Ev5 Ev7. Subgoal 1.24: Variables: G V2 E2 E1 Hd1 Tl1 I1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (index E1 E2) V2 @ Ev3 : eval_e G E1 (consVal Hd1 Tl1) * Ev4 : eval_e G E2 (intVal I1) * Ev5 : indexRel (consVal Hd1 Tl1) I1 V2 Ev2 : eval_e G E1 (consVal Hd1 Tl1) Ev6 : eval_e G E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 ============================ V2 = V2
< search. Subgoal 1.25: Variables: G V2 ListVal Length E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (simple_imp:list:length E1) (intVal Length) @ Ev2 : eval_e G (simple_imp:list:length E1) V2 Ev3 : eval_e G E1 ListVal * Ev4 : lengthRel ListVal Length ============================ intVal Length = V2
< Ev2: case Ev2. Subgoal 1.25: Variables: G ListVal Length E1 ListVal1 Length1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (simple_imp:list:length E1) (intVal Length) @ Ev3 : eval_e G E1 ListVal * Ev4 : lengthRel ListVal Length Ev2 : eval_e G E1 ListVal1 Ev5 : lengthRel ListVal1 Length1 ============================ intVal Length = intVal Length1
< apply IH to Ev3 Ev2. Subgoal 1.25: Variables: G Length E1 ListVal1 Length1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (simple_imp:list:length E1) (intVal Length) @ Ev3 : eval_e G E1 ListVal1 * Ev4 : lengthRel ListVal1 Length Ev2 : eval_e G E1 ListVal1 Ev5 : lengthRel ListVal1 Length1 ============================ intVal Length = intVal Length1
< apply simple_imp:list:length_unique to Ev4 Ev5. Subgoal 1.25: Variables: G E1 ListVal1 Length1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2 Ev1 : eval_e G (simple_imp:list:length E1) (intVal Length1) @ Ev3 : eval_e G E1 ListVal1 * Ev4 : lengthRel ListVal1 Length1 Ev2 : eval_e G E1 ListVal1 Ev5 : lengthRel ListVal1 Length1 ============================ intVal Length1 = intVal Length1
< search. Proof completed.
< Prove simple_imp:host:update_rec_fields_unique. Proof completed.
< Prove_Constraint simple_imp:host:proj_c_eval. Proof completed.
< Add_Ext_Size simple_imp:host:eval_c. Proof completed.
< Add_Proj_Rel simple_imp:host:eval_c. Proof completed.
< Prove_Ext_Ind simple_imp:host:eval_c. Proof completed.
< Prove simple_imp:host:eval_c_unique. Proof completed.
< Prove_Constraint simple_imp:host:proj_c_eval_results. Proof completed.
< Prove_Constraint simple_imp:host:proj_c_eval_results_back. Proof completed.
< Prove simple_imp:host:vars_eval_same_result, simple_imp:host:vars_equal_rf_same_result. Subgoal 1.18: Variables: G1 G2 D V2 Ty IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (nil Ty) D Ev1 : eval_e G1 (nil Ty) nilVal @ Ev2 : eval_e G2 (nil Ty) V2 ============================ nilVal = V2
< case Ev2. Subgoal 1.18: Variables: G1 G2 D Ty IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (nil Ty) D Ev1 : eval_e G1 (nil Ty) nilVal @ ============================ nilVal = nilVal
< search. Subgoal 1.19: Variables: G1 G2 D V2 V4 V3 E2 E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (cons E1 E2) D Ev1 : eval_e G1 (cons E1 E2) (consVal V3 V4) @ Ev2 : eval_e G2 (cons E1 E2) V2 Ev3 : eval_e G1 E1 V3 * Ev4 : eval_e G1 E2 V4 * ============================ consVal V3 V4 = V2
< Ev2: case Ev2. Subgoal 1.19: Variables: G1 G2 D V4 V3 E2 E1 V6 V5 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (cons E1 E2) D Ev1 : eval_e G1 (cons E1 E2) (consVal V3 V4) @ Ev3 : eval_e G1 E1 V3 * Ev4 : eval_e G1 E2 V4 * Ev2 : eval_e G2 E1 V5 Ev5 : eval_e G2 E2 V6 ============================ consVal V3 V4 = consVal V5 V6
< Vars1: case Vars. Subgoal 1.19: Variables: G1 G2 D V4 V3 E2 E1 V6 V5 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (cons E1 E2) (consVal V3 V4) @ Ev3 : eval_e G1 E1 V3 * Ev4 : eval_e G1 E2 V4 * Ev2 : eval_e G2 E1 V5 Ev5 : eval_e G2 E2 V6 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ consVal V3 V4 = consVal V5 V6
< apply IH to _ Vars1 Ev3 Ev2. Subgoal 1.19.1: Variables: G1 G2 D V4 V3 E2 E1 V6 V5 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (cons E1 E2) (consVal V3 V4) @ Ev3 : eval_e G1 E1 V3 * Ev4 : eval_e G1 E2 V4 * Ev2 : eval_e G2 E1 V5 Ev5 : eval_e G2 E2 V6 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left. Subgoal 1.19: Variables: G1 G2 D V4 E2 E1 V6 V5 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (cons E1 E2) (consVal V5 V4) @ Ev3 : eval_e G1 E1 V5 * Ev4 : eval_e G1 E2 V4 * Ev2 : eval_e G2 E1 V5 Ev5 : eval_e G2 E2 V6 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ consVal V5 V4 = consVal V5 V6
< apply IH to _ Vars2 Ev4 Ev5. Subgoal 1.19.2: Variables: G1 G2 D V4 E2 E1 V6 V5 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (cons E1 E2) (consVal V5 V4) @ Ev3 : eval_e G1 E1 V5 * Ev4 : eval_e G1 E2 V4 * Ev2 : eval_e G2 E1 V5 Ev5 : eval_e G2 E2 V6 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right. Subgoal 1.19: Variables: G1 G2 D E2 E1 V6 V5 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (cons E1 E2) (consVal V5 V6) @ Ev3 : eval_e G1 E1 V5 * Ev4 : eval_e G1 E2 V6 * Ev2 : eval_e G2 E1 V5 Ev5 : eval_e G2 E2 V6 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ consVal V5 V6 = consVal V5 V6
< search. Subgoal 1.20: Variables: G1 G2 D V2 E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (null E1) D Ev1 : eval_e G1 (null E1) trueVal @ Ev2 : eval_e G2 (null E1) V2 Ev3 : eval_e G1 E1 nilVal * ============================ trueVal = V2
< Ev2: case Ev2. Subgoal 1.20.1: Variables: G1 G2 D E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (null E1) D Ev1 : eval_e G1 (null E1) trueVal @ Ev3 : eval_e G1 E1 nilVal * Ev2 : eval_e G2 E1 nilVal ============================ trueVal = trueVal
< search. Subgoal 1.20.2: Variables: G1 G2 D E1 V3 V4 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (null E1) D Ev1 : eval_e G1 (null E1) trueVal @ Ev3 : eval_e G1 E1 nilVal * Ev2 : eval_e G2 E1 (consVal V3 V4) ============================ trueVal = falseVal
< Vars1: case Vars. Subgoal 1.20.2: Variables: G1 G2 D E1 V3 V4 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (null E1) trueVal @ Ev3 : eval_e G1 E1 nilVal * Ev2 : eval_e G2 E1 (consVal V3 V4) Vars1 : vars E1 D ============================ trueVal = falseVal
< apply IH to _ Vars1 Ev3 Ev2. Subgoal 1.21: Variables: G1 G2 D V2 V3 V4 E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (null E1) D Ev1 : eval_e G1 (null E1) falseVal @ Ev2 : eval_e G2 (null E1) V2 Ev3 : eval_e G1 E1 (consVal V3 V4) * ============================ falseVal = V2
< Ev2: case Ev2. Subgoal 1.21.1: Variables: G1 G2 D V3 V4 E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (null E1) D Ev1 : eval_e G1 (null E1) falseVal @ Ev3 : eval_e G1 E1 (consVal V3 V4) * Ev2 : eval_e G2 E1 nilVal ============================ falseVal = trueVal
< Vars1: case Vars. Subgoal 1.21.1: Variables: G1 G2 D V3 V4 E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (null E1) falseVal @ Ev3 : eval_e G1 E1 (consVal V3 V4) * Ev2 : eval_e G2 E1 nilVal Vars1 : vars E1 D ============================ falseVal = trueVal
< apply IH to _ Vars1 Ev3 Ev2. Subgoal 1.21.2: Variables: G1 G2 D V3 V4 E1 V5 V6 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (null E1) D Ev1 : eval_e G1 (null E1) falseVal @ Ev3 : eval_e G1 E1 (consVal V3 V4) * Ev2 : eval_e G2 E1 (consVal V5 V6) ============================ falseVal = falseVal
< search. Subgoal 1.22: Variables: G1 G2 D V1 V2 V3 E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (head E1) D Ev1 : eval_e G1 (head E1) V1 @ Ev2 : eval_e G2 (head E1) V2 Ev3 : eval_e G1 E1 (consVal V1 V3) * ============================ V1 = V2
< Ev2: case Ev2. Subgoal 1.22: Variables: G1 G2 D V1 V2 V3 E1 V4 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (head E1) D Ev1 : eval_e G1 (head E1) V1 @ Ev3 : eval_e G1 E1 (consVal V1 V3) * Ev2 : eval_e G2 E1 (consVal V2 V4) ============================ V1 = V2
< Vars1: case Vars. Subgoal 1.22: Variables: G1 G2 D V1 V2 V3 E1 V4 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (head E1) V1 @ Ev3 : eval_e G1 E1 (consVal V1 V3) * Ev2 : eval_e G2 E1 (consVal V2 V4) Vars1 : vars E1 D ============================ V1 = V2
< apply IH to _ Vars1 Ev3 Ev2. Subgoal 1.22: Variables: G1 G2 D V2 E1 V4 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (head E1) V2 @ Ev3 : eval_e G1 E1 (consVal V2 V4) * Ev2 : eval_e G2 E1 (consVal V2 V4) Vars1 : vars E1 D ============================ V2 = V2
< search. Subgoal 1.23: Variables: G1 G2 D V1 V2 V3 E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (tail E1) D Ev1 : eval_e G1 (tail E1) V1 @ Ev2 : eval_e G2 (tail E1) V2 Ev3 : eval_e G1 E1 (consVal V3 V1) * ============================ V1 = V2
< Ev2: case Ev2. Subgoal 1.23: Variables: G1 G2 D V1 V2 V3 E1 V4 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (tail E1) D Ev1 : eval_e G1 (tail E1) V1 @ Ev3 : eval_e G1 E1 (consVal V3 V1) * Ev2 : eval_e G2 E1 (consVal V4 V2) ============================ V1 = V2
< Vars1: case Vars. Subgoal 1.23: Variables: G1 G2 D V1 V2 V3 E1 V4 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (tail E1) V1 @ Ev3 : eval_e G1 E1 (consVal V3 V1) * Ev2 : eval_e G2 E1 (consVal V4 V2) Vars1 : vars E1 D ============================ V1 = V2
< apply IH to _ Vars1 Ev3 Ev2. Subgoal 1.23: Variables: G1 G2 D V2 E1 V4 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (tail E1) V2 @ Ev3 : eval_e G1 E1 (consVal V4 V2) * Ev2 : eval_e G2 E1 (consVal V4 V2) Vars1 : vars E1 D ============================ V2 = V2
< search. Subgoal 1.24: Variables: G1 G2 D V1 V2 Hd Tl I E2 E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (index E1 E2) D Ev1 : eval_e G1 (index E1 E2) V1 @ Ev2 : eval_e G2 (index E1 E2) V2 Ev3 : eval_e G1 E1 (consVal Hd Tl) * Ev4 : eval_e G1 E2 (intVal I) * Ev5 : indexRel (consVal Hd Tl) I V1 ============================ V1 = V2
< Ev2: case Ev2. Subgoal 1.24: Variables: G1 G2 D V1 V2 Hd Tl I E2 E1 Hd1 Tl1 I1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (index E1 E2) D Ev1 : eval_e G1 (index E1 E2) V1 @ Ev3 : eval_e G1 E1 (consVal Hd Tl) * Ev4 : eval_e G1 E2 (intVal I) * Ev5 : indexRel (consVal Hd Tl) I V1 Ev2 : eval_e G2 E1 (consVal Hd1 Tl1) Ev6 : eval_e G2 E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 ============================ V1 = V2
< Vars1: case Vars. Subgoal 1.24: Variables: G1 G2 D V1 V2 Hd Tl I E2 E1 Hd1 Tl1 I1 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (index E1 E2) V1 @ Ev3 : eval_e G1 E1 (consVal Hd Tl) * Ev4 : eval_e G1 E2 (intVal I) * Ev5 : indexRel (consVal Hd Tl) I V1 Ev2 : eval_e G2 E1 (consVal Hd1 Tl1) Ev6 : eval_e G2 E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ V1 = V2
< apply IH to _ Vars1 Ev3 Ev2. Subgoal 1.24.1: Variables: G1 G2 D V1 V2 Hd Tl I E2 E1 Hd1 Tl1 I1 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (index E1 E2) V1 @ Ev3 : eval_e G1 E1 (consVal Hd Tl) * Ev4 : eval_e G1 E2 (intVal I) * Ev5 : indexRel (consVal Hd Tl) I V1 Ev2 : eval_e G2 E1 (consVal Hd1 Tl1) Ev6 : eval_e G2 E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left. Subgoal 1.24: Variables: G1 G2 D V1 V2 I E2 E1 Hd1 Tl1 I1 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (index E1 E2) V1 @ Ev3 : eval_e G1 E1 (consVal Hd1 Tl1) * Ev4 : eval_e G1 E2 (intVal I) * Ev5 : indexRel (consVal Hd1 Tl1) I V1 Ev2 : eval_e G2 E1 (consVal Hd1 Tl1) Ev6 : eval_e G2 E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ V1 = V2
< apply IH to _ Vars2 Ev4 Ev6. Subgoal 1.24.2: Variables: G1 G2 D V1 V2 I E2 E1 Hd1 Tl1 I1 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (index E1 E2) V1 @ Ev3 : eval_e G1 E1 (consVal Hd1 Tl1) * Ev4 : eval_e G1 E2 (intVal I) * Ev5 : indexRel (consVal Hd1 Tl1) I V1 Ev2 : eval_e G2 E1 (consVal Hd1 Tl1) Ev6 : eval_e G2 E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right. Subgoal 1.24: Variables: G1 G2 D V1 V2 E2 E1 Hd1 Tl1 I1 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (index E1 E2) V1 @ Ev3 : eval_e G1 E1 (consVal Hd1 Tl1) * Ev4 : eval_e G1 E2 (intVal I1) * Ev5 : indexRel (consVal Hd1 Tl1) I1 V1 Ev2 : eval_e G2 E1 (consVal Hd1 Tl1) Ev6 : eval_e G2 E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ V1 = V2
< apply index_unique to Ev5 Ev7. Subgoal 1.24: Variables: G1 G2 D V2 E2 E1 Hd1 Tl1 I1 D2 D3 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (index E1 E2) V2 @ Ev3 : eval_e G1 E1 (consVal Hd1 Tl1) * Ev4 : eval_e G1 E2 (intVal I1) * Ev5 : indexRel (consVal Hd1 Tl1) I1 V2 Ev2 : eval_e G2 E1 (consVal Hd1 Tl1) Ev6 : eval_e G2 E2 (intVal I1) Ev7 : indexRel (consVal Hd1 Tl1) I1 V2 Vars1 : vars E1 D2 Vars2 : vars E2 D3 Vars3 : D2 ++ D3 = D ============================ V2 = V2
< search. Subgoal 1.25: Variables: G1 G2 D V2 ListVal Length E1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (simple_imp:list:length E1) D Ev1 : eval_e G1 (simple_imp:list:length E1) (intVal Length) @ Ev2 : eval_e G2 (simple_imp:list:length E1) V2 Ev3 : eval_e G1 E1 ListVal * Ev4 : lengthRel ListVal Length ============================ intVal Length = V2
< Ev2: case Ev2. Subgoal 1.25: Variables: G1 G2 D ListVal Length E1 ListVal1 Length1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars (simple_imp:list:length E1) D Ev1 : eval_e G1 (simple_imp:list:length E1) (intVal Length) @ Ev3 : eval_e G1 E1 ListVal * Ev4 : lengthRel ListVal Length Ev2 : eval_e G2 E1 ListVal1 Ev5 : lengthRel ListVal1 Length1 ============================ intVal Length = intVal Length1
< Vars1: case Vars. Subgoal 1.25: Variables: G1 G2 D ListVal Length E1 ListVal1 Length1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (simple_imp:list:length E1) (intVal Length) @ Ev3 : eval_e G1 E1 ListVal * Ev4 : lengthRel ListVal Length Ev2 : eval_e G2 E1 ListVal1 Ev5 : lengthRel ListVal1 Length1 Vars1 : vars E1 D ============================ intVal Length = intVal Length1
< apply IH to _ Vars1 Ev3 Ev2. Subgoal 1.25: Variables: G1 G2 D Length E1 ListVal1 Length1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (simple_imp:list:length E1) (intVal Length) @ Ev3 : eval_e G1 E1 ListVal1 * Ev4 : lengthRel ListVal1 Length Ev2 : eval_e G2 E1 ListVal1 Ev5 : lengthRel ListVal1 Length1 Vars1 : vars E1 D ============================ intVal Length = intVal Length1
< apply simple_imp:list:length_unique to Ev4 Ev5. Subgoal 1.25: Variables: G1 G2 D E1 ListVal1 Length1 IH : forall G1 G2 E D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2 IH1 : forall G1 G2 RF D V1 V2, (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (simple_imp:list:length E1) (intVal Length1) @ Ev3 : eval_e G1 E1 ListVal1 * Ev4 : lengthRel ListVal1 Length1 Ev2 : eval_e G2 E1 ListVal1 Ev5 : lengthRel ListVal1 Length1 Vars1 : vars E1 D ============================ intVal Length1 = intVal Length1
< search. Proof completed.