Reasoning Details

 < 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.
Back to example home