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