< Module library:list.
< Prove_Constraint library:host:proj_e_unique. Subgoal 1: Variables: E1 E2 Hyp : |{e}- null E1 ~~> E1 Hyp1 : |{e}- null E1 ~~> E2 ============================ E1 = E2
< case Hyp1. Subgoal 1: Variables: E2 Hyp : |{e}- null E2 ~~> E2 ============================ E2 = E2
< search. Subgoal 2: Variables: E1 E2 Hyp : |{e}- head E1 ~~> E1 Hyp1 : |{e}- head E1 ~~> E2 ============================ E1 = E2
< case Hyp1. Subgoal 2: Variables: E2 Hyp : |{e}- head E2 ~~> E2 ============================ E2 = E2
< search. Subgoal 3: Variables: E1 E2 Hyp : |{e}- tail E1 ~~> E1 Hyp1 : |{e}- tail E1 ~~> E2 ============================ E1 = E2
< case Hyp1. Subgoal 3: Variables: E2 Hyp : |{e}- tail E2 ~~> E2 ============================ E2 = E2
< search. Subgoal 4: Variables: E2 Hyp : |{e}- nil ~~> trueE Hyp1 : |{e}- nil ~~> E2 ============================ trueE = E2
< case Hyp1. Subgoal 4: Hyp : |{e}- nil ~~> trueE ============================ trueE = trueE
< search. Subgoal 5: Variables: E2 E4 E3 Hyp : |{e}- cons E3 E4 ~~> eq E3 E4 Hyp1 : |{e}- cons E3 E4 ~~> E2 ============================ eq E3 E4 = E2
< case Hyp1. Subgoal 5: Variables: E4 E3 Hyp : |{e}- cons E3 E4 ~~> eq E3 E4 ============================ eq E3 E4 = eq E3 E4
< search. Proof completed.
< Prove_Constraint library:host:proj_e_is. Subgoal 1: Variables: E' Hyp : |{e}- null E' ~~> E' Hyp1 : is_e (null E') ============================ is_e E'
< case Hyp1. Subgoal 1: Variables: E' Hyp : |{e}- null E' ~~> E' H1 : is_e E' ============================ is_e E'
< search. Subgoal 2: Variables: E' Hyp : |{e}- head E' ~~> E' Hyp1 : is_e (head E') ============================ is_e E'
< case Hyp1. Subgoal 2: Variables: E' Hyp : |{e}- head E' ~~> E' H1 : is_e E' ============================ is_e E'
< search. Subgoal 3: Variables: E' Hyp : |{e}- tail E' ~~> E' Hyp1 : is_e (tail E') ============================ is_e E'
< case Hyp1. Subgoal 3: Variables: E' Hyp : |{e}- tail E' ~~> E' H1 : is_e E' ============================ is_e E'
< search. Subgoal 4: Hyp : |{e}- nil ~~> trueE Hyp1 : is_e nil ============================ is_e trueE
< case Hyp1. Subgoal 4: Hyp : |{e}- nil ~~> trueE ============================ is_e trueE
< search. Subgoal 5: Variables: E2 E1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp1 : is_e (cons E1 E2) ============================ is_e (eq E1 E2)
< case Hyp1. Subgoal 5: Variables: E2 E1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 H1 : is_e E1 H2 : is_e E2 ============================ is_e (eq E1 E2)
< search. Proof completed.
< Prove_Constraint library:host:proj_s_unique. Variables: S2 Hd Tl E Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : |{s}- splitlist Hd Tl E ~~> S2 Hyp2 : Hd = Tl -> false ============================ seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) = S2
< case Hyp1. Variables: Hd Tl E Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false H1 : Hd = Tl -> false ============================ seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) = seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
< search. Proof completed.
< Prove_Constraint library:host:proj_s_is. Variables: Hd Tl E Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : is_s (splitlist Hd Tl E) Hyp2 : Hd = Tl -> false ============================ is_s (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))))
< case Hyp1. Variables: Hd Tl E Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false H1 : is_string Hd H2 : is_string Tl H3 : is_e E ============================ is_s (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))))
< search. Proof completed.
< Prove_Constraint library:host:proj_ty_unique. Variables: Ty1 Ty2 Hyp : |{ty}- list Ty1 ~~> Ty1 Hyp1 : |{ty}- list Ty1 ~~> Ty2 ============================ Ty1 = Ty2
< case Hyp1. Variables: Ty2 Hyp : |{ty}- list Ty2 ~~> Ty2 ============================ Ty2 = Ty2
< search. Proof completed.
< Prove_Constraint library:host:proj_ty_is. Variables: Ty' Hyp : |{ty}- list Ty' ~~> Ty' Hyp1 : is_ty (list Ty') ============================ is_ty Ty'
< case Hyp1. Variables: Ty' Hyp : |{ty}- list Ty' ~~> Ty' H1 : is_ty Ty' ============================ is_ty Ty'
< search. Proof completed.
< Add_Proj_Rel library:host:is_e. Proof completed.
< Prove_Ext_Ind library:host:is_e. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Subgoal 9: IH : forall E, is_e E * -> <is_e {P}> E R : is_e nil @ ============================ <is_e {P}> nil
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> <is_e {P}> E R : is_e (cons E1 E2) @ R1 : is_e E1 * R2 : is_e E2 * ============================ <is_e {P}> (cons E1 E2)
< apply IH to R1. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> <is_e {P}> E R : is_e (cons E1 E2) @ R1 : is_e E1 * R2 : is_e E2 * H1 : <is_e {P}> E1 ============================ <is_e {P}> (cons E1 E2)
< apply IH to R2. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> <is_e {P}> E R : is_e (cons E1 E2) @ R1 : is_e E1 * R2 : is_e E2 * H1 : <is_e {P}> E1 H2 : <is_e {P}> E2 ============================ <is_e {P}> (cons E1 E2)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> <is_e {P}> E R : is_e (null E1) @ R1 : is_e E1 * ============================ <is_e {P}> (null E1)
< apply IH to R1. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> <is_e {P}> E R : is_e (null E1) @ R1 : is_e E1 * H1 : <is_e {P}> E1 ============================ <is_e {P}> (null E1)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> <is_e {P}> E R : is_e (head E1) @ R1 : is_e E1 * ============================ <is_e {P}> (head E1)
< apply IH to R1. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> <is_e {P}> E R : is_e (head E1) @ R1 : is_e E1 * H1 : <is_e {P}> E1 ============================ <is_e {P}> (head E1)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> <is_e {P}> E R : is_e (tail E1) @ R1 : is_e E1 * ============================ <is_e {P}> (tail E1)
< apply IH to R1. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> <is_e {P}> E R : is_e (tail E1) @ R1 : is_e E1 * H1 : <is_e {P}> E1 ============================ <is_e {P}> (tail E1)
< search. Proof completed.
< Prove library:host:is_e_var_or_not. Subgoal 9: IH : forall E, is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false) IsE : is_e nil @ ============================ (exists N, nil = var N) \/ ((exists N, nil = var N) -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists N, cons E1 E2 = var N) \/ ((exists N, cons E1 E2 = var N) -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists N, null E1 = var N) \/ ((exists N, null E1 = var N) -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists N, head E1 = var N) \/ ((exists N, head E1 = var N) -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists N, tail E1 = var N) \/ ((exists N, tail E1 = var N) -> false)
< search. Proof completed.
< Prove library:host:is_e_intlit_or_not. Subgoal 9: IH : forall E, is_e E * -> (exists I, E = intlit I) \/ ((exists I, E = intlit I) -> false) IsE : is_e nil @ ============================ (exists I, nil = intlit I) \/ ((exists I, nil = intlit I) -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists I, E = intlit I) \/ ((exists I, E = intlit I) -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists I, cons E1 E2 = intlit I) \/ ((exists I, cons E1 E2 = intlit I) -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists I, E = intlit I) \/ ((exists I, E = intlit I) -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists I, null E1 = intlit I) \/ ((exists I, null E1 = intlit I) -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists I, E = intlit I) \/ ((exists I, E = intlit I) -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists I, head E1 = intlit I) \/ ((exists I, head E1 = intlit I) -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists I, E = intlit I) \/ ((exists I, E = intlit I) -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists I, tail E1 = intlit I) \/ ((exists I, tail E1 = intlit I) -> false)
< search. Proof completed.
< Prove library:host:is_e_trueE_or_not. Subgoal 9: IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false) IsE : is_e nil @ ============================ nil = trueE \/ (nil = trueE -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ cons E1 E2 = trueE \/ (cons E1 E2 = trueE -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ null E1 = trueE \/ (null E1 = trueE -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ head E1 = trueE \/ (head E1 = trueE -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ tail E1 = trueE \/ (tail E1 = trueE -> false)
< search. Proof completed.
< Prove library:host:is_e_falseE_or_not. Subgoal 9: IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false) IsE : is_e nil @ ============================ nil = falseE \/ (nil = falseE -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ cons E1 E2 = falseE \/ (cons E1 E2 = falseE -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ null E1 = falseE \/ (null E1 = falseE -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ head E1 = falseE \/ (head E1 = falseE -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ tail E1 = falseE \/ (tail E1 = falseE -> false)
< search. Proof completed.
< Prove library:host:is_e_add_or_not. Subgoal 9: IH : forall E, is_e E * -> (exists E1 E2, E = add E1 E2) \/ ((exists E1 E2, E = add E1 E2) -> false) IsE : is_e nil @ ============================ (exists E1 E2, nil = add E1 E2) \/ ((exists E1 E2, nil = add E1 E2) -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists E1 E2, E = add E1 E2) \/ ((exists E1 E2, E = add E1 E2) -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E3 E4, cons E1 E2 = add E3 E4) \/ ((exists E3 E4, cons E1 E2 = add E3 E4) -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = add E1 E2) \/ ((exists E1 E2, E = add E1 E2) -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, null E1 = add E2 E3) \/ ((exists E2 E3, null E1 = add E2 E3) -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = add E1 E2) \/ ((exists E1 E2, E = add E1 E2) -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, head E1 = add E2 E3) \/ ((exists E2 E3, head E1 = add E2 E3) -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = add E1 E2) \/ ((exists E1 E2, E = add E1 E2) -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, tail E1 = add E2 E3) \/ ((exists E2 E3, tail E1 = add E2 E3) -> false)
< search. Proof completed.
< Prove library:host:is_e_eqC_or_not. Subgoal 9: IH : forall E, is_e E * -> (exists E1 E2, E = eq E1 E2) \/ ((exists E1 E2, E = eq E1 E2) -> false) IsE : is_e nil @ ============================ (exists E1 E2, nil = eq E1 E2) \/ ((exists E1 E2, nil = eq E1 E2) -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists E1 E2, E = eq E1 E2) \/ ((exists E1 E2, E = eq E1 E2) -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E3 E4, cons E1 E2 = eq E3 E4) \/ ((exists E3 E4, cons E1 E2 = eq E3 E4) -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = eq E1 E2) \/ ((exists E1 E2, E = eq E1 E2) -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, null E1 = eq E2 E3) \/ ((exists E2 E3, null E1 = eq E2 E3) -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = eq E1 E2) \/ ((exists E1 E2, E = eq E1 E2) -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, head E1 = eq E2 E3) \/ ((exists E2 E3, head E1 = eq E2 E3) -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = eq E1 E2) \/ ((exists E1 E2, E = eq E1 E2) -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, tail E1 = eq E2 E3) \/ ((exists E2 E3, tail E1 = eq E2 E3) -> false)
< search. Proof completed.
< Prove library:host:is_e_gt_or_not. Subgoal 9: IH : forall E, is_e E * -> (exists E1 E2, E = gt E1 E2) \/ ((exists E1 E2, E = gt E1 E2) -> false) IsE : is_e nil @ ============================ (exists E1 E2, nil = gt E1 E2) \/ ((exists E1 E2, nil = gt E1 E2) -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists E1 E2, E = gt E1 E2) \/ ((exists E1 E2, E = gt E1 E2) -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E3 E4, cons E1 E2 = gt E3 E4) \/ ((exists E3 E4, cons E1 E2 = gt E3 E4) -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = gt E1 E2) \/ ((exists E1 E2, E = gt E1 E2) -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, null E1 = gt E2 E3) \/ ((exists E2 E3, null E1 = gt E2 E3) -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = gt E1 E2) \/ ((exists E1 E2, E = gt E1 E2) -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, head E1 = gt E2 E3) \/ ((exists E2 E3, head E1 = gt E2 E3) -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = gt E1 E2) \/ ((exists E1 E2, E = gt E1 E2) -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, tail E1 = gt E2 E3) \/ ((exists E2 E3, tail E1 = gt E2 E3) -> false)
< search. Proof completed.
< Prove library:host:is_e_not_or_not. Subgoal 9: IH : forall E, is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false) IsE : is_e nil @ ============================ (exists E', nil = not E') \/ ((exists E', nil = not E') -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', cons E1 E2 = not E') \/ ((exists E', cons E1 E2 = not E') -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists E', null E1 = not E') \/ ((exists E', null E1 = not E') -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists E', head E1 = not E') \/ ((exists E', head E1 = not E') -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists E', tail E1 = not E') \/ ((exists E', tail E1 = not E') -> false)
< search. Proof completed.
< Extensible_Theorem is_e_nil_or_not : forall E, IsE : is_e E -> E = library:list:nil \/ (E = library:list:nil -> false) on IsE. Subgoal 1: Variables: S IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (var S) @ IsE1 : is_string S ============================ var S = nil \/ (var S = nil -> false)
< search. Subgoal 2: Variables: I IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (intlit I) @ IsE1 : is_integer I ============================ intlit I = nil \/ (intlit I = nil -> false)
< search. Subgoal 3: IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e trueE @ ============================ trueE = nil \/ (trueE = nil -> false)
< search. Subgoal 4: IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e falseE @ ============================ falseE = nil \/ (falseE = nil -> false)
< search. Subgoal 5: Variables: E2 E1 IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (add E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ add E1 E2 = nil \/ (add E1 E2 = nil -> false)
< search. Subgoal 6: Variables: E2 E1 IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (eq E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ eq E1 E2 = nil \/ (eq E1 E2 = nil -> false)
< search. Subgoal 7: Variables: E2 E1 IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (gt E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ gt E1 E2 = nil \/ (gt E1 E2 = nil -> false)
< search. Subgoal 8: Variables: E1 IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (not E1) @ IsE1 : is_e E1 * ============================ not E1 = nil \/ (not E1 = nil -> false)
< search. Subgoal 9: IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e nil @ ============================ nil = nil \/ (nil = nil -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ cons E1 E2 = nil \/ (cons E1 E2 = nil -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ null E1 = nil \/ (null E1 = nil -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ head E1 = nil \/ (head E1 = nil -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ tail E1 = nil \/ (tail E1 = nil -> false)
< search. Subgoal 14: Variables: X_T IH : forall E, is_e E * -> E = nil \/ (E = nil -> false) IsE : is_e <unknown K is_e> @ IsE1 : |{e}- <unknown K is_e> ~~> X_T IsE2 : is_e X_T * ============================ <unknown K is_e> = nil \/ (<unknown K is_e> = nil -> false)
< search. Proof completed.
< Extensible_Theorem is_e_cons_or_not : forall E, IsE : is_e E -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) on IsE. Subgoal 1: Variables: S IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (var S) @ IsE1 : is_string S ============================ (exists E1 E2, var S = cons E1 E2) \/ ((exists E1 E2, var S = cons E1 E2) -> false)
< search. Subgoal 2: Variables: I IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (intlit I) @ IsE1 : is_integer I ============================ (exists E1 E2, intlit I = cons E1 E2) \/ ((exists E1 E2, intlit I = cons E1 E2) -> false)
< search. Subgoal 3: IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e trueE @ ============================ (exists E1 E2, trueE = cons E1 E2) \/ ((exists E1 E2, trueE = cons E1 E2) -> false)
< search. Subgoal 4: IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e falseE @ ============================ (exists E1 E2, falseE = cons E1 E2) \/ ((exists E1 E2, falseE = cons E1 E2) -> false)
< search. Subgoal 5: Variables: E2 E1 IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (add E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E3 E4, add E1 E2 = cons E3 E4) \/ ((exists E3 E4, add E1 E2 = cons E3 E4) -> false)
< search. Subgoal 6: Variables: E2 E1 IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (eq E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E3 E4, eq E1 E2 = cons E3 E4) \/ ((exists E3 E4, eq E1 E2 = cons E3 E4) -> false)
< search. Subgoal 7: Variables: E2 E1 IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (gt E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E3 E4, gt E1 E2 = cons E3 E4) \/ ((exists E3 E4, gt E1 E2 = cons E3 E4) -> false)
< search. Subgoal 8: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (not E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, not E1 = cons E2 E3) \/ ((exists E2 E3, not E1 = cons E2 E3) -> false)
< search. Subgoal 9: IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e nil @ ============================ (exists E1 E2, nil = cons E1 E2) \/ ((exists E1 E2, nil = cons E1 E2) -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E3 E4, cons E1 E2 = cons E3 E4) \/ ((exists E3 E4, cons E1 E2 = cons E3 E4) -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, null E1 = cons E2 E3) \/ ((exists E2 E3, null E1 = cons E2 E3) -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, head E1 = cons E2 E3) \/ ((exists E2 E3, head E1 = cons E2 E3) -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists E2 E3, tail E1 = cons E2 E3) \/ ((exists E2 E3, tail E1 = cons E2 E3) -> false)
< search. Subgoal 14: Variables: X_T IH : forall E, is_e E * -> (exists E1 E2, E = cons E1 E2) \/ ((exists E1 E2, E = cons E1 E2) -> false) IsE : is_e <unknown K is_e> @ IsE1 : |{e}- <unknown K is_e> ~~> X_T IsE2 : is_e X_T * ============================ (exists E1 E2, <unknown K is_e> = cons E1 E2) \/ ((exists E1 E2, <unknown K is_e> = cons E1 E2) -> false)
< search. Proof completed.
< Extensible_Theorem is_e_null_or_not : forall E, IsE : is_e E -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) on IsE. Subgoal 1: Variables: S IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (var S) @ IsE1 : is_string S ============================ (exists E', var S = null E') \/ ((exists E', var S = null E') -> false)
< search. Subgoal 2: Variables: I IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (intlit I) @ IsE1 : is_integer I ============================ (exists E', intlit I = null E') \/ ((exists E', intlit I = null E') -> false)
< search. Subgoal 3: IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e trueE @ ============================ (exists E', trueE = null E') \/ ((exists E', trueE = null E') -> false)
< search. Subgoal 4: IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e falseE @ ============================ (exists E', falseE = null E') \/ ((exists E', falseE = null E') -> false)
< search. Subgoal 5: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (add E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', add E1 E2 = null E') \/ ((exists E', add E1 E2 = null E') -> false)
< search. Subgoal 6: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (eq E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', eq E1 E2 = null E') \/ ((exists E', eq E1 E2 = null E') -> false)
< search. Subgoal 7: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (gt E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', gt E1 E2 = null E') \/ ((exists E', gt E1 E2 = null E') -> false)
< search. Subgoal 8: Variables: E1 IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (not E1) @ IsE1 : is_e E1 * ============================ (exists E', not E1 = null E') \/ ((exists E', not E1 = null E') -> false)
< search. Subgoal 9: IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e nil @ ============================ (exists E', nil = null E') \/ ((exists E', nil = null E') -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', cons E1 E2 = null E') \/ ((exists E', cons E1 E2 = null E') -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists E', null E1 = null E') \/ ((exists E', null E1 = null E') -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists E', head E1 = null E') \/ ((exists E', head E1 = null E') -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists E', tail E1 = null E') \/ ((exists E', tail E1 = null E') -> false)
< search. Subgoal 14: Variables: X_T IH : forall E, is_e E * -> (exists E', E = null E') \/ ((exists E', E = null E') -> false) IsE : is_e <unknown K is_e> @ IsE1 : |{e}- <unknown K is_e> ~~> X_T IsE2 : is_e X_T * ============================ (exists E', <unknown K is_e> = null E') \/ ((exists E', <unknown K is_e> = null E') -> false)
< search. Proof completed.
< Extensible_Theorem is_e_head_or_not : forall E, IsE : is_e E -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) on IsE. Subgoal 1: Variables: S IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (var S) @ IsE1 : is_string S ============================ (exists E', var S = head E') \/ ((exists E', var S = head E') -> false)
< search. Subgoal 2: Variables: I IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (intlit I) @ IsE1 : is_integer I ============================ (exists E', intlit I = head E') \/ ((exists E', intlit I = head E') -> false)
< search. Subgoal 3: IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e trueE @ ============================ (exists E', trueE = head E') \/ ((exists E', trueE = head E') -> false)
< search. Subgoal 4: IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e falseE @ ============================ (exists E', falseE = head E') \/ ((exists E', falseE = head E') -> false)
< search. Subgoal 5: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (add E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', add E1 E2 = head E') \/ ((exists E', add E1 E2 = head E') -> false)
< search. Subgoal 6: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (eq E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', eq E1 E2 = head E') \/ ((exists E', eq E1 E2 = head E') -> false)
< search. Subgoal 7: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (gt E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', gt E1 E2 = head E') \/ ((exists E', gt E1 E2 = head E') -> false)
< search. Subgoal 8: Variables: E1 IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (not E1) @ IsE1 : is_e E1 * ============================ (exists E', not E1 = head E') \/ ((exists E', not E1 = head E') -> false)
< search. Subgoal 9: IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e nil @ ============================ (exists E', nil = head E') \/ ((exists E', nil = head E') -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', cons E1 E2 = head E') \/ ((exists E', cons E1 E2 = head E') -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists E', null E1 = head E') \/ ((exists E', null E1 = head E') -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists E', head E1 = head E') \/ ((exists E', head E1 = head E') -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists E', tail E1 = head E') \/ ((exists E', tail E1 = head E') -> false)
< search. Subgoal 14: Variables: X_T IH : forall E, is_e E * -> (exists E', E = head E') \/ ((exists E', E = head E') -> false) IsE : is_e <unknown K is_e> @ IsE1 : |{e}- <unknown K is_e> ~~> X_T IsE2 : is_e X_T * ============================ (exists E', <unknown K is_e> = head E') \/ ((exists E', <unknown K is_e> = head E') -> false)
< search. Proof completed.
< Extensible_Theorem is_e_tail_or_not : forall E, IsE : is_e E -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) on IsE. Subgoal 1: Variables: S IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (var S) @ IsE1 : is_string S ============================ (exists E', var S = tail E') \/ ((exists E', var S = tail E') -> false)
< search. Subgoal 2: Variables: I IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (intlit I) @ IsE1 : is_integer I ============================ (exists E', intlit I = tail E') \/ ((exists E', intlit I = tail E') -> false)
< search. Subgoal 3: IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e trueE @ ============================ (exists E', trueE = tail E') \/ ((exists E', trueE = tail E') -> false)
< search. Subgoal 4: IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e falseE @ ============================ (exists E', falseE = tail E') \/ ((exists E', falseE = tail E') -> false)
< search. Subgoal 5: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (add E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', add E1 E2 = tail E') \/ ((exists E', add E1 E2 = tail E') -> false)
< search. Subgoal 6: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (eq E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', eq E1 E2 = tail E') \/ ((exists E', eq E1 E2 = tail E') -> false)
< search. Subgoal 7: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (gt E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', gt E1 E2 = tail E') \/ ((exists E', gt E1 E2 = tail E') -> false)
< search. Subgoal 8: Variables: E1 IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (not E1) @ IsE1 : is_e E1 * ============================ (exists E', not E1 = tail E') \/ ((exists E', not E1 = tail E') -> false)
< search. Subgoal 9: IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e nil @ ============================ (exists E', nil = tail E') \/ ((exists E', nil = tail E') -> false)
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ (exists E', cons E1 E2 = tail E') \/ ((exists E', cons E1 E2 = tail E') -> false)
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ (exists E', null E1 = tail E') \/ ((exists E', null E1 = tail E') -> false)
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ (exists E', head E1 = tail E') \/ ((exists E', head E1 = tail E') -> false)
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ (exists E', tail E1 = tail E') \/ ((exists E', tail E1 = tail E') -> false)
< search. Subgoal 14: Variables: X_T IH : forall E, is_e E * -> (exists E', E = tail E') \/ ((exists E', E = tail E') -> false) IsE : is_e <unknown K is_e> @ IsE1 : |{e}- <unknown K is_e> ~~> X_T IsE2 : is_e X_T * ============================ (exists E', <unknown K is_e> = tail E') \/ ((exists E', <unknown K is_e> = tail E') -> false)
< search. Proof completed.
< Prove library:host:is_e_eq_or_not. Subgoal 9: Variables: E2 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e nil @ IsE2 : is_e E2 ============================ nil = E2 \/ (nil = E2 -> false)
< Or: apply is_e_nil_or_not to IsE2. Subgoal 9: Variables: E2 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e nil @ IsE2 : is_e E2 Or : E2 = nil \/ (E2 = nil -> false) ============================ nil = E2 \/ (nil = E2 -> false)
< E: case Or. Subgoal 9.1: IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e nil @ IsE2 : is_e nil ============================ nil = nil \/ (nil = nil -> false)
< search. Subgoal 9.2: Variables: E2 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e nil @ IsE2 : is_e E2 E : E2 = nil -> false ============================ nil = E2 \/ (nil = E2 -> false)
< right. Subgoal 9.2: Variables: E2 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e nil @ IsE2 : is_e E2 E : E2 = nil -> false ============================ nil = E2 -> false
< intros Eq. Subgoal 9.2: Variables: E2 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e nil @ IsE2 : is_e E2 E : E2 = nil -> false Eq : nil = E2 ============================ false
< case Eq. Subgoal 9.2: IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e nil @ IsE2 : is_e nil E : nil = nil -> false ============================ false
< backchain E. Subgoal 10: Variables: E2 E E3 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE2 : is_e E2 IsE3 : is_e E3 * IsE4 : is_e E * ============================ cons E3 E = E2 \/ (cons E3 E = E2 -> false)
< Or: apply is_e_cons_or_not to IsE2. Subgoal 10: Variables: E2 E E3 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE2 : is_e E2 IsE3 : is_e E3 * IsE4 : is_e E * Or : (exists E1 E3, E2 = cons E1 E3) \/ ((exists E1 E3, E2 = cons E1 E3) -> false) ============================ cons E3 E = E2 \/ (cons E3 E = E2 -> false)
< E: case Or. Subgoal 10.1: Variables: E E3 E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE2 : is_e (cons E4 E5) IsE3 : is_e E3 * IsE4 : is_e E * ============================ cons E3 E = cons E4 E5 \/ (cons E3 E = cons E4 E5 -> false)
< Is: case IsE2. Subgoal 10.1: Variables: E E3 E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE3 : is_e E3 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 ============================ cons E3 E = cons E4 E5 \/ (cons E3 E = cons E4 E5 -> false)
< Or: apply IH to IsE3 Is. Subgoal 10.1: Variables: E E3 E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE3 : is_e E3 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 Or : E3 = E4 \/ (E3 = E4 -> false) ============================ cons E3 E = cons E4 E5 \/ (cons E3 E = cons E4 E5 -> false)
< E: case Or. Subgoal 10.1.1: Variables: E E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E4 E) @ IsE3 : is_e E4 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 ============================ cons E4 E = cons E4 E5 \/ (cons E4 E = cons E4 E5 -> false)
< Or: apply IH to IsE4 Is1. Subgoal 10.1.1: Variables: E E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E4 E) @ IsE3 : is_e E4 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 Or : E = E5 \/ (E = E5 -> false) ============================ cons E4 E = cons E4 E5 \/ (cons E4 E = cons E4 E5 -> false)
< E: case Or. Subgoal 10.1.1.1: Variables: E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E4 E5) @ IsE3 : is_e E4 * IsE4 : is_e E5 * Is : is_e E4 Is1 : is_e E5 ============================ cons E4 E5 = cons E4 E5 \/ (cons E4 E5 = cons E4 E5 -> false)
< search. Subgoal 10.1.1.2: Variables: E E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E4 E) @ IsE3 : is_e E4 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 E : E = E5 -> false ============================ cons E4 E = cons E4 E5 \/ (cons E4 E = cons E4 E5 -> false)
< right. Subgoal 10.1.1.2: Variables: E E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E4 E) @ IsE3 : is_e E4 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 E : E = E5 -> false ============================ cons E4 E = cons E4 E5 -> false
< intros Eq. Subgoal 10.1.1.2: Variables: E E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E4 E) @ IsE3 : is_e E4 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 E : E = E5 -> false Eq : cons E4 E = cons E4 E5 ============================ false
< case Eq. Subgoal 10.1.1.2: Variables: E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E4 E5) @ IsE3 : is_e E4 * IsE4 : is_e E5 * Is : is_e E4 Is1 : is_e E5 E : E5 = E5 -> false ============================ false
< backchain E. Subgoal 10.1.2: Variables: E E3 E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE3 : is_e E3 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 E : E3 = E4 -> false ============================ cons E3 E = cons E4 E5 \/ (cons E3 E = cons E4 E5 -> false)
< right. Subgoal 10.1.2: Variables: E E3 E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE3 : is_e E3 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 E : E3 = E4 -> false ============================ cons E3 E = cons E4 E5 -> false
< intros Eq. Subgoal 10.1.2: Variables: E E3 E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE3 : is_e E3 * IsE4 : is_e E * Is : is_e E4 Is1 : is_e E5 E : E3 = E4 -> false Eq : cons E3 E = cons E4 E5 ============================ false
< case Eq. Subgoal 10.1.2: Variables: E4 E5 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E4 E5) @ IsE3 : is_e E4 * IsE4 : is_e E5 * Is : is_e E4 Is1 : is_e E5 E : E4 = E4 -> false ============================ false
< backchain E. Subgoal 10.2: Variables: E2 E E3 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE2 : is_e E2 IsE3 : is_e E3 * IsE4 : is_e E * E : (exists E1 E3, E2 = cons E1 E3) -> false ============================ cons E3 E = E2 \/ (cons E3 E = E2 -> false)
< right. Subgoal 10.2: Variables: E2 E E3 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE2 : is_e E2 IsE3 : is_e E3 * IsE4 : is_e E * E : (exists E1 E3, E2 = cons E1 E3) -> false ============================ cons E3 E = E2 -> false
< intros Eq. Subgoal 10.2: Variables: E2 E E3 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE2 : is_e E2 IsE3 : is_e E3 * IsE4 : is_e E * E : (exists E1 E3, E2 = cons E1 E3) -> false Eq : cons E3 E = E2 ============================ false
< backchain E. Subgoal 10.2: Variables: E2 E E3 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE2 : is_e E2 IsE3 : is_e E3 * IsE4 : is_e E * E : (exists E1 E3, E2 = cons E1 E3) -> false Eq : cons E3 E = E2 ============================ exists E1 E3, E2 = cons E1 E3
< case Eq. Subgoal 10.2: Variables: E E3 IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (cons E3 E) @ IsE2 : is_e (cons E3 E) IsE3 : is_e E3 * IsE4 : is_e E * E : (exists E1 E2, cons E3 E = cons E1 E2) -> false ============================ exists E1 E2, cons E3 E = cons E1 E2
< search. Subgoal 11: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE2 : is_e E2 IsE3 : is_e E * ============================ null E = E2 \/ (null E = E2 -> false)
< Or: apply is_e_null_or_not to IsE2. Subgoal 11: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE2 : is_e E2 IsE3 : is_e E * Or : (exists E', E2 = null E') \/ ((exists E', E2 = null E') -> false) ============================ null E = E2 \/ (null E = E2 -> false)
< E: case Or. Subgoal 11.1: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE2 : is_e (null E') IsE3 : is_e E * ============================ null E = null E' \/ (null E = null E' -> false)
< Is: case IsE2. Subgoal 11.1: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE3 : is_e E * Is : is_e E' ============================ null E = null E' \/ (null E = null E' -> false)
< Or: apply IH to IsE3 Is. Subgoal 11.1: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE3 : is_e E * Is : is_e E' Or : E = E' \/ (E = E' -> false) ============================ null E = null E' \/ (null E = null E' -> false)
< E: case Or. Subgoal 11.1.1: Variables: E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E') @ IsE3 : is_e E' * Is : is_e E' ============================ null E' = null E' \/ (null E' = null E' -> false)
< search. Subgoal 11.1.2: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE3 : is_e E * Is : is_e E' E : E = E' -> false ============================ null E = null E' \/ (null E = null E' -> false)
< right. Subgoal 11.1.2: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE3 : is_e E * Is : is_e E' E : E = E' -> false ============================ null E = null E' -> false
< intros Eq. Subgoal 11.1.2: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE3 : is_e E * Is : is_e E' E : E = E' -> false Eq : null E = null E' ============================ false
< case Eq. Subgoal 11.1.2: Variables: E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E') @ IsE3 : is_e E' * Is : is_e E' E : E' = E' -> false ============================ false
< backchain E. Subgoal 11.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = null E') -> false ============================ null E = E2 \/ (null E = E2 -> false)
< right. Subgoal 11.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = null E') -> false ============================ null E = E2 -> false
< intros Eq. Subgoal 11.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = null E') -> false Eq : null E = E2 ============================ false
< backchain E. Subgoal 11.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = null E') -> false Eq : null E = E2 ============================ exists E', E2 = null E'
< case Eq. Subgoal 11.2: Variables: E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (null E) @ IsE2 : is_e (null E) IsE3 : is_e E * E : (exists E', null E = null E') -> false ============================ exists E', null E = null E'
< search. Subgoal 12: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE2 : is_e E2 IsE3 : is_e E * ============================ head E = E2 \/ (head E = E2 -> false)
< Or: apply is_e_head_or_not to IsE2. Subgoal 12: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE2 : is_e E2 IsE3 : is_e E * Or : (exists E', E2 = head E') \/ ((exists E', E2 = head E') -> false) ============================ head E = E2 \/ (head E = E2 -> false)
< E: case Or. Subgoal 12.1: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE2 : is_e (head E') IsE3 : is_e E * ============================ head E = head E' \/ (head E = head E' -> false)
< Is: case IsE2. Subgoal 12.1: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE3 : is_e E * Is : is_e E' ============================ head E = head E' \/ (head E = head E' -> false)
< Or: apply IH to IsE3 Is. Subgoal 12.1: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE3 : is_e E * Is : is_e E' Or : E = E' \/ (E = E' -> false) ============================ head E = head E' \/ (head E = head E' -> false)
< E: case Or. Subgoal 12.1.1: Variables: E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E') @ IsE3 : is_e E' * Is : is_e E' ============================ head E' = head E' \/ (head E' = head E' -> false)
< search. Subgoal 12.1.2: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE3 : is_e E * Is : is_e E' E : E = E' -> false ============================ head E = head E' \/ (head E = head E' -> false)
< right. Subgoal 12.1.2: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE3 : is_e E * Is : is_e E' E : E = E' -> false ============================ head E = head E' -> false
< intros Eq. Subgoal 12.1.2: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE3 : is_e E * Is : is_e E' E : E = E' -> false Eq : head E = head E' ============================ false
< case Eq. Subgoal 12.1.2: Variables: E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E') @ IsE3 : is_e E' * Is : is_e E' E : E' = E' -> false ============================ false
< backchain E. Subgoal 12.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = head E') -> false ============================ head E = E2 \/ (head E = E2 -> false)
< right. Subgoal 12.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = head E') -> false ============================ head E = E2 -> false
< intros Eq. Subgoal 12.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = head E') -> false Eq : head E = E2 ============================ false
< backchain E. Subgoal 12.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = head E') -> false Eq : head E = E2 ============================ exists E', E2 = head E'
< case Eq. Subgoal 12.2: Variables: E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (head E) @ IsE2 : is_e (head E) IsE3 : is_e E * E : (exists E', head E = head E') -> false ============================ exists E', head E = head E'
< search. Subgoal 13: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE2 : is_e E2 IsE3 : is_e E * ============================ tail E = E2 \/ (tail E = E2 -> false)
< Or: apply is_e_tail_or_not to IsE2. Subgoal 13: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE2 : is_e E2 IsE3 : is_e E * Or : (exists E', E2 = tail E') \/ ((exists E', E2 = tail E') -> false) ============================ tail E = E2 \/ (tail E = E2 -> false)
< E: case Or. Subgoal 13.1: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE2 : is_e (tail E') IsE3 : is_e E * ============================ tail E = tail E' \/ (tail E = tail E' -> false)
< Is: case IsE2. Subgoal 13.1: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE3 : is_e E * Is : is_e E' ============================ tail E = tail E' \/ (tail E = tail E' -> false)
< Or: apply IH to IsE3 Is. Subgoal 13.1: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE3 : is_e E * Is : is_e E' Or : E = E' \/ (E = E' -> false) ============================ tail E = tail E' \/ (tail E = tail E' -> false)
< E: case Or. Subgoal 13.1.1: Variables: E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E') @ IsE3 : is_e E' * Is : is_e E' ============================ tail E' = tail E' \/ (tail E' = tail E' -> false)
< search. Subgoal 13.1.2: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE3 : is_e E * Is : is_e E' E : E = E' -> false ============================ tail E = tail E' \/ (tail E = tail E' -> false)
< right. Subgoal 13.1.2: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE3 : is_e E * Is : is_e E' E : E = E' -> false ============================ tail E = tail E' -> false
< intros Eq. Subgoal 13.1.2: Variables: E E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE3 : is_e E * Is : is_e E' E : E = E' -> false Eq : tail E = tail E' ============================ false
< case Eq. Subgoal 13.1.2: Variables: E' IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E') @ IsE3 : is_e E' * Is : is_e E' E : E' = E' -> false ============================ false
< backchain E. Subgoal 13.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = tail E') -> false ============================ tail E = E2 \/ (tail E = E2 -> false)
< right. Subgoal 13.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = tail E') -> false ============================ tail E = E2 -> false
< intros Eq. Subgoal 13.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = tail E') -> false Eq : tail E = E2 ============================ false
< backchain E. Subgoal 13.2: Variables: E2 E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE2 : is_e E2 IsE3 : is_e E * E : (exists E', E2 = tail E') -> false Eq : tail E = E2 ============================ exists E', E2 = tail E'
< case Eq. Subgoal 13.2: Variables: E IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false) IsE1 : is_e (tail E) @ IsE2 : is_e (tail E) IsE3 : is_e E * E : (exists E', tail E = tail E') -> false ============================ exists E', tail E = tail E'
< search. Proof completed.
< Prove library:host:vars_unique. Subgoal 9: Variables: V2 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars nil [] @ Vars2 : vars nil V2 ============================ [] = V2
< case Vars2. Subgoal 9: IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars nil [] @ ============================ [] = []
< search. Subgoal 10: Variables: V1 V2 Vr1 Vr2 E2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V1 @ Vars2 : vars (cons E1 E2) V2 Vars3 : vars E1 Vr1 * Vars4 : vars E2 Vr2 * Vars5 : Vr1 ++ Vr2 = V1 ============================ V1 = V2
< V: case Vars2. Subgoal 10: Variables: V1 V2 Vr1 Vr2 E2 E1 Vr3 Vr4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V1 @ Vars3 : vars E1 Vr1 * Vars4 : vars E2 Vr2 * Vars5 : Vr1 ++ Vr2 = V1 V : vars E1 Vr3 V1 : vars E2 Vr4 V2 : Vr3 ++ Vr4 = V2 ============================ V1 = V2
< apply IH to Vars3 V. Subgoal 10: Variables: V1 V2 Vr2 E2 E1 Vr3 Vr4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V1 @ Vars3 : vars E1 Vr3 * Vars4 : vars E2 Vr2 * Vars5 : Vr3 ++ Vr2 = V1 V : vars E1 Vr3 V1 : vars E2 Vr4 V2 : Vr3 ++ Vr4 = V2 ============================ V1 = V2
< apply IH to Vars4 V1. Subgoal 10: Variables: V1 V2 E2 E1 Vr3 Vr4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V1 @ Vars3 : vars E1 Vr3 * Vars4 : vars E2 Vr4 * Vars5 : Vr3 ++ Vr4 = V1 V : vars E1 Vr3 V1 : vars E2 Vr4 V2 : Vr3 ++ Vr4 = V2 ============================ V1 = V2
< apply append_unique to Vars5 V2. Subgoal 10: Variables: V2 E2 E1 Vr3 Vr4 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (cons E1 E2) V2 @ Vars3 : vars E1 Vr3 * Vars4 : vars E2 Vr4 * Vars5 : Vr3 ++ Vr4 = V2 V : vars E1 Vr3 V1 : vars E2 Vr4 V2 : Vr3 ++ Vr4 = V2 ============================ V2 = V2
< search. Subgoal 11: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (null E1) V1 @ Vars2 : vars (null E1) V2 Vars3 : vars E1 V1 * ============================ V1 = V2
< V: case Vars2. Subgoal 11: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (null E1) V1 @ Vars3 : vars E1 V1 * V : vars E1 V2 ============================ V1 = V2
< apply IH to Vars3 V. Subgoal 11: Variables: V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (null E1) V2 @ Vars3 : vars E1 V2 * V : vars E1 V2 ============================ V2 = V2
< search. Subgoal 12: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (head E1) V1 @ Vars2 : vars (head E1) V2 Vars3 : vars E1 V1 * ============================ V1 = V2
< V: case Vars2. Subgoal 12: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (head E1) V1 @ Vars3 : vars E1 V1 * V : vars E1 V2 ============================ V1 = V2
< apply IH to Vars3 V. Subgoal 12: Variables: V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (head E1) V2 @ Vars3 : vars E1 V2 * V : vars E1 V2 ============================ V2 = V2
< search. Subgoal 13: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (tail E1) V1 @ Vars2 : vars (tail E1) V2 Vars3 : vars E1 V1 * ============================ V1 = V2
< V: case Vars2. Subgoal 13: Variables: V1 V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (tail E1) V1 @ Vars3 : vars E1 V1 * V : vars E1 V2 ============================ V1 = V2
< apply IH to Vars3 V. Subgoal 13: Variables: V2 E1 IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2 Vars1 : vars (tail E1) V2 @ Vars3 : vars E1 V2 * V : vars E1 V2 ============================ V2 = V2
< search. Proof completed.
< Prove_Constraint library:host:proj_e_vars_exist. Subgoal 1: Variables: E' V Hyp : |{e}- null E' ~~> E' Hyp1 : vars (null E') V ============================ exists V', vars E' V'
< case Hyp1. Subgoal 1: Variables: E' V Hyp : |{e}- null E' ~~> E' H1 : vars E' V ============================ exists V', vars E' V'
< search. Subgoal 2: Variables: E' V Hyp : |{e}- head E' ~~> E' Hyp1 : vars (head E') V ============================ exists V', vars E' V'
< case Hyp1. Subgoal 2: Variables: E' V Hyp : |{e}- head E' ~~> E' H1 : vars E' V ============================ exists V', vars E' V'
< search. Subgoal 3: Variables: E' V Hyp : |{e}- tail E' ~~> E' Hyp1 : vars (tail E') V ============================ exists V', vars E' V'
< case Hyp1. Subgoal 3: Variables: E' V Hyp : |{e}- tail E' ~~> E' H1 : vars E' V ============================ exists V', vars E' V'
< search. Subgoal 4: Variables: V Hyp : |{e}- nil ~~> trueE Hyp1 : vars nil V ============================ exists V', vars trueE V'
< search. Subgoal 5: Variables: V E2 E1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp1 : vars (cons E1 E2) V ============================ exists V', vars (eq E1 E2) V'
< case Hyp1. Subgoal 5: Variables: V E2 E1 Vr1 Vr2 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 H1 : vars E1 Vr1 H2 : vars E2 Vr2 H3 : Vr1 ++ Vr2 = V ============================ exists V', vars (eq E1 E2) V'
< search. Proof completed.
< Prove_Constraint library:host:proj_e_vars. Subgoal 1: 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'
< V: case Hyp1. Subgoal 1: Variables: E' V V' X Hyp : |{e}- null E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V V : vars E' V ============================ mem X V'
< apply vars_unique to V Hyp2. Subgoal 1: Variables: E' V' X Hyp : |{e}- null E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V' V : vars E' V' ============================ mem X V'
< search. Subgoal 2: 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'
< V: case Hyp1. Subgoal 2: Variables: E' V V' X Hyp : |{e}- head E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V V : vars E' V ============================ mem X V'
< apply vars_unique to V Hyp2. Subgoal 2: Variables: E' V' X Hyp : |{e}- head E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V' V : vars E' V' ============================ mem X V'
< search. Subgoal 3: 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'
< V: case Hyp1. Subgoal 3: Variables: E' V V' X Hyp : |{e}- tail E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V V : vars E' V ============================ mem X V'
< apply vars_unique to V Hyp2. Subgoal 3: Variables: E' V' X Hyp : |{e}- tail E' ~~> E' Hyp2 : vars E' V' Hyp3 : mem X V' V : vars E' V' ============================ mem X V'
< search. Subgoal 4: Variables: V V' X Hyp : |{e}- nil ~~> trueE Hyp1 : vars nil V Hyp2 : vars trueE V' Hyp3 : mem X V ============================ mem X V'
< case Hyp1. Subgoal 4: Variables: V' X Hyp : |{e}- nil ~~> trueE Hyp2 : vars trueE V' Hyp3 : mem X [] ============================ mem X V'
< case Hyp2. Subgoal 4: Variables: X Hyp : |{e}- nil ~~> trueE Hyp3 : mem X [] ============================ mem X []
< search. Subgoal 5: Variables: V V' X E2 E1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp1 : vars (cons E1 E2) V Hyp2 : vars (eq E1 E2) V' Hyp3 : mem X V ============================ mem X V'
< V: case Hyp1. Subgoal 5: Variables: V V' X E2 E1 Vr1 Vr2 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp2 : vars (eq E1 E2) V' Hyp3 : mem X V V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V ============================ mem X V'
< V': case Hyp2. Subgoal 5: Variables: V V' X E2 E1 Vr1 Vr2 Vr3 Vr4 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp3 : mem X V V : vars E1 Vr1 V1 : vars E2 Vr2 V2 : Vr1 ++ Vr2 = V V' : vars E1 Vr3 V'1 : vars E2 Vr4 V'2 : Vr3 ++ Vr4 = V' ============================ mem X V'
< apply vars_unique to V V'. Subgoal 5: Variables: V V' X E2 E1 Vr2 Vr3 Vr4 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp3 : mem X V V : vars E1 Vr3 V1 : vars E2 Vr2 V2 : Vr3 ++ Vr2 = V V' : vars E1 Vr3 V'1 : vars E2 Vr4 V'2 : Vr3 ++ Vr4 = V' ============================ mem X V'
< apply vars_unique to V1 V'1. Subgoal 5: Variables: V V' X E2 E1 Vr3 Vr4 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp3 : mem X V V : vars E1 Vr3 V1 : vars E2 Vr4 V2 : Vr3 ++ Vr4 = V V' : vars E1 Vr3 V'1 : vars E2 Vr4 V'2 : Vr3 ++ Vr4 = V' ============================ mem X V'
< apply append_unique to V2 V'2. Subgoal 5: Variables: V' X E2 E1 Vr3 Vr4 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp3 : mem X V' V : vars E1 Vr3 V1 : vars E2 Vr4 V2 : Vr3 ++ Vr4 = V' V' : vars E1 Vr3 V'1 : vars E2 Vr4 V'2 : Vr3 ++ Vr4 = V' ============================ mem X V'
< search. Proof completed.
< Prove library:host:vars_is. Subgoal 9: IH : forall E V, is_e E -> vars E V * -> is_list is_string V IsE : is_e nil Vars : vars nil [] @ ============================ is_list is_string []
< search. Subgoal 10: Variables: V Vr1 Vr2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V IsE : is_e (cons E1 E2) Vars : vars (cons E1 E2) V @ Vars1 : vars E1 Vr1 * Vars2 : vars E2 Vr2 * Vars3 : Vr1 ++ Vr2 = V ============================ is_list is_string V
< Is: case IsE. Subgoal 10: Variables: V Vr1 Vr2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (cons E1 E2) V @ Vars1 : vars E1 Vr1 * Vars2 : vars E2 Vr2 * Vars3 : Vr1 ++ Vr2 = V Is : is_e E1 Is1 : is_e E2 ============================ is_list is_string V
< apply IH to Is Vars1. Subgoal 10: Variables: V Vr1 Vr2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (cons E1 E2) V @ Vars1 : vars E1 Vr1 * Vars2 : vars E2 Vr2 * Vars3 : Vr1 ++ Vr2 = V Is : is_e E1 Is1 : is_e E2 H1 : is_list is_string Vr1 ============================ is_list is_string V
< apply IH to Is1 Vars2. Subgoal 10: Variables: V Vr1 Vr2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (cons E1 E2) V @ Vars1 : vars E1 Vr1 * Vars2 : vars E2 Vr2 * Vars3 : Vr1 ++ Vr2 = V Is : is_e E1 Is1 : is_e E2 H1 : is_list is_string Vr1 H2 : is_list is_string Vr2 ============================ is_list is_string V
< apply append__is_list__is_string to _ _ Vars3. Subgoal 10: Variables: V Vr1 Vr2 E2 E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (cons E1 E2) V @ Vars1 : vars E1 Vr1 * Vars2 : vars E2 Vr2 * Vars3 : Vr1 ++ Vr2 = V Is : is_e E1 Is1 : is_e E2 H1 : is_list is_string Vr1 H2 : is_list is_string Vr2 H3 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 11: Variables: V E1 IH : forall E V, is_e E -> vars E 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
< Is: case IsE. Subgoal 11: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (null E1) V @ Vars1 : vars E1 V * Is : is_e E1 ============================ is_list is_string V
< apply IH to Is Vars1. Subgoal 11: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (null E1) V @ Vars1 : vars E1 V * Is : is_e E1 H1 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 12: Variables: V E1 IH : forall E V, is_e E -> vars E 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
< Is: case IsE. Subgoal 12: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (head E1) V @ Vars1 : vars E1 V * Is : is_e E1 ============================ is_list is_string V
< apply IH to Is Vars1. Subgoal 12: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (head E1) V @ Vars1 : vars E1 V * Is : is_e E1 H1 : is_list is_string V ============================ is_list is_string V
< search. Subgoal 13: Variables: V E1 IH : forall E V, is_e E -> vars E 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
< Is: case IsE. Subgoal 13: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (tail E1) V @ Vars1 : vars E1 V * Is : is_e E1 ============================ is_list is_string V
< apply IH to Is Vars1. Subgoal 13: Variables: V E1 IH : forall E V, is_e E -> vars E V * -> is_list is_string V Vars : vars (tail E1) V @ Vars1 : vars E1 V * Is : is_e E1 H1 : is_list is_string V ============================ is_list is_string V
< search. Proof completed.
< Prove library:host:vars_exist. Subgoal 9: IH : forall E, is_e E * -> exists V, vars E V IsE : is_e nil @ ============================ exists V, vars nil V
< search. Subgoal 10: Variables: E2 E1 IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * ============================ exists V, vars (cons E1 E2) V
< V1: apply IH to IsE1. Subgoal 10: Variables: E2 E1 V IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * V1 : vars E1 V ============================ exists V, vars (cons E1 E2) V
< V2: apply IH to IsE2. Subgoal 10: Variables: E2 E1 V V1 IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * V1 : vars E1 V V2 : vars E2 V1 ============================ exists V, vars (cons E1 E2) V
< Is1: apply vars_is to IsE1 V1. Subgoal 10: Variables: E2 E1 V V1 IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * V1 : vars E1 V V2 : vars E2 V1 Is1 : is_list is_string V ============================ exists V, vars (cons E1 E2) V
< Is2: apply vars_is to IsE2 V2. Subgoal 10: Variables: E2 E1 V V1 IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * V1 : vars E1 V V2 : vars E2 V1 Is1 : is_list is_string V Is2 : is_list is_string V1 ============================ exists V, vars (cons E1 E2) V
< apply append__is_list__is_string__total to Is1 Is2. Subgoal 10: Variables: E2 E1 V V1 L IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (cons E1 E2) @ IsE1 : is_e E1 * IsE2 : is_e E2 * V1 : vars E1 V V2 : vars E2 V1 Is1 : is_list is_string V Is2 : is_list is_string V1 H1 : V ++ V1 = L ============================ exists V, vars (cons E1 E2) V
< search. Subgoal 11: Variables: E1 IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (null E1) @ IsE1 : is_e E1 * ============================ exists V, vars (null E1) V
< apply IH to IsE1. Subgoal 11: Variables: E1 V IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (null E1) @ IsE1 : is_e E1 * H1 : vars E1 V ============================ exists V, vars (null E1) V
< search. Subgoal 12: Variables: E1 IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (head E1) @ IsE1 : is_e E1 * ============================ exists V, vars (head E1) V
< apply IH to IsE1. Subgoal 12: Variables: E1 V IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (head E1) @ IsE1 : is_e E1 * H1 : vars E1 V ============================ exists V, vars (head E1) V
< search. Subgoal 13: Variables: E1 IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (tail E1) @ IsE1 : is_e E1 * ============================ exists V, vars (tail E1) V
< apply IH to IsE1. Subgoal 13: Variables: E1 V IH : forall E, is_e E * -> exists V, vars E V IsE : is_e (tail E1) @ IsE1 : is_e E1 * H1 : vars E1 V ============================ exists V, vars (tail E1) V
< search. Proof completed.
< Prove library:host:value_empty_typable. Subgoal 4: Variables: G Ty IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty Value : value nil @ Ty : ty_e G nil Ty ============================ ty_e [] nil Ty
< case Ty. Subgoal 4: Variables: G Ty1 IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty Value : value nil @ ============================ ty_e [] nil (list Ty1)
< search. Subgoal 5: Variables: G Ty E2 E1 IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty Value : value (cons E1 E2) @ Ty : ty_e G (cons E1 E2) Ty Value1 : value E1 * Value2 : value E2 * ============================ ty_e [] (cons E1 E2) Ty
< Ty: case Ty. Subgoal 5: Variables: G E2 E1 Ty1 IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty Value : value (cons E1 E2) @ Value1 : value E1 * Value2 : value E2 * Ty : ty_e G E1 Ty1 Ty1 : ty_e G E2 (list Ty1) ============================ ty_e [] (cons E1 E2) (list Ty1)
< apply IH to Value1 Ty. Subgoal 5: Variables: G E2 E1 Ty1 IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty Value : value (cons E1 E2) @ Value1 : value E1 * Value2 : value E2 * Ty : ty_e G E1 Ty1 Ty1 : ty_e G E2 (list Ty1) H1 : ty_e [] E1 Ty1 ============================ ty_e [] (cons E1 E2) (list Ty1)
< apply IH to Value2 Ty1. Subgoal 5: Variables: G E2 E1 Ty1 IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty Value : value (cons E1 E2) @ Value1 : value E1 * Value2 : value E2 * Ty : ty_e G E1 Ty1 Ty1 : ty_e G E2 (list Ty1) H1 : ty_e [] E1 Ty1 H2 : ty_e [] E2 (list Ty1) ============================ ty_e [] (cons E1 E2) (list Ty1)
< search. Proof completed.
< Prove library:host:eval_e_is. Subgoal 12: Variables: G IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsE : is_e nil IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G nil nil @ ============================ is_e nil
< search. Subgoal 13: Variables: G V2 V1 E2 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsE : is_e (cons E1 E2) IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (cons E1 E2) (cons V1 V2) @ Ev1 : eval_e G E1 V1 * Ev2 : eval_e G E2 V2 * ============================ is_e (cons V1 V2)
< case IsE. Subgoal 13: Variables: G V2 V1 E2 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (cons E1 E2) (cons V1 V2) @ Ev1 : eval_e G E1 V1 * Ev2 : eval_e G E2 V2 * H1 : is_e E1 H2 : is_e E2 ============================ is_e (cons V1 V2)
< apply IH to _ _ Ev1. Subgoal 13: Variables: G V2 V1 E2 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (cons E1 E2) (cons V1 V2) @ Ev1 : eval_e G E1 V1 * Ev2 : eval_e G E2 V2 * H1 : is_e E1 H2 : is_e E2 H3 : is_e V1 ============================ is_e (cons V1 V2)
< apply IH to _ _ Ev2. Subgoal 13: Variables: G V2 V1 E2 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (cons E1 E2) (cons V1 V2) @ Ev1 : eval_e G E1 V1 * Ev2 : eval_e G E2 V2 * H1 : is_e E1 H2 : is_e E2 H3 : is_e V1 H4 : is_e V2 ============================ is_e (cons V1 V2)
< search. Subgoal 14: Variables: G E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsE : is_e (null E1) IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (null E1) trueE @ Ev1 : eval_e G E1 nil * ============================ is_e trueE
< search. Subgoal 15: Variables: G V1 V2 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsE : is_e (null E1) IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (null E1) falseE @ Ev1 : eval_e G E1 (cons V1 V2) * ============================ is_e falseE
< search. Subgoal 16: Variables: G V V2 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsE : is_e (head E1) IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (head E1) V @ Ev1 : eval_e G E1 (cons V V2) * ============================ is_e V
< case IsE. Subgoal 16: Variables: G V V2 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (head E1) V @ Ev1 : eval_e G E1 (cons V V2) * H1 : is_e E1 ============================ is_e V
< IsV: apply IH to _ _ Ev1. Subgoal 16: Variables: G V V2 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (head E1) V @ Ev1 : eval_e G E1 (cons V V2) * H1 : is_e E1 IsV : is_e (cons V V2) ============================ is_e V
< case IsV. Subgoal 16: Variables: G V V2 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (head E1) V @ Ev1 : eval_e G E1 (cons V V2) * H1 : is_e E1 H2 : is_e V H3 : is_e V2 ============================ is_e V
< search. Subgoal 17: Variables: G V V1 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsE : is_e (tail E1) IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (tail E1) V @ Ev1 : eval_e G E1 (cons V1 V) * ============================ is_e V
< case IsE. Subgoal 17: Variables: G V V1 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (tail E1) V @ Ev1 : eval_e G E1 (cons V1 V) * H1 : is_e E1 ============================ is_e V
< IsV: apply IH to _ _ Ev1. Subgoal 17: Variables: G V V1 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (tail E1) V @ Ev1 : eval_e G E1 (cons V1 V) * H1 : is_e E1 IsV : is_e (cons V1 V) ============================ is_e V
< case IsV. Subgoal 17: Variables: G V V1 E1 IH : forall G E V, is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V IsCtx : is_list (is_pair is_string is_e) G Ev : eval_e G (tail E1) V @ Ev1 : eval_e G E1 (cons V1 V) * H1 : is_e E1 H2 : is_e V1 H3 : is_e V ============================ is_e V
< search. Proof completed.
< Prove library:host:type_preservation_e. Subgoal 12: Variables: TG EG Ty IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ty : ty_e TG nil Ty Ev : eval_e EG nil nil @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty ============================ ty_e [] nil Ty
< case Ty. Subgoal 12: Variables: TG EG Ty1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG nil nil @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty ============================ ty_e [] nil (list Ty1)
< search. Subgoal 13: Variables: TG EG Ty V2 V1 E2 E1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ty : ty_e TG (cons E1 E2) Ty Ev : eval_e EG (cons E1 E2) (cons V1 V2) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 V1 * Ev2 : eval_e EG E2 V2 * ============================ ty_e [] (cons V1 V2) Ty
< Ty: case Ty. Subgoal 13: Variables: TG EG V2 V1 E2 E1 Ty1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (cons E1 E2) (cons V1 V2) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 V1 * Ev2 : eval_e EG E2 V2 * Ty : ty_e TG E1 Ty1 Ty1 : ty_e TG E2 (list Ty1) ============================ ty_e [] (cons V1 V2) (list Ty1)
< apply IH to Ty Ev1 Rel. Subgoal 13: Variables: TG EG V2 V1 E2 E1 Ty1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (cons E1 E2) (cons V1 V2) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 V1 * Ev2 : eval_e EG E2 V2 * Ty : ty_e TG E1 Ty1 Ty1 : ty_e TG E2 (list Ty1) H1 : ty_e [] V1 Ty1 ============================ ty_e [] (cons V1 V2) (list Ty1)
< apply IH to Ty1 Ev2 Rel. Subgoal 13: Variables: TG EG V2 V1 E2 E1 Ty1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (cons E1 E2) (cons V1 V2) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 V1 * Ev2 : eval_e EG E2 V2 * Ty : ty_e TG E1 Ty1 Ty1 : ty_e TG E2 (list Ty1) H1 : ty_e [] V1 Ty1 H2 : ty_e [] V2 (list Ty1) ============================ ty_e [] (cons V1 V2) (list Ty1)
< search. Subgoal 14: Variables: TG EG Ty E1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ty : ty_e TG (null E1) Ty Ev : eval_e EG (null E1) trueE @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 nil * ============================ ty_e [] trueE Ty
< case Ty. Subgoal 14: Variables: TG EG E1 Ty1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (null E1) trueE @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 nil * H1 : ty_e TG E1 (list Ty1) ============================ ty_e [] trueE bool
< search. Subgoal 15: Variables: TG EG Ty V1 V2 E1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ty : ty_e TG (null E1) Ty Ev : eval_e EG (null E1) falseE @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V1 V2) * ============================ ty_e [] falseE Ty
< case Ty. Subgoal 15: Variables: TG EG V1 V2 E1 Ty1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (null E1) falseE @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V1 V2) * H1 : ty_e TG E1 (list Ty1) ============================ ty_e [] falseE bool
< search. Subgoal 16: Variables: TG EG Ty V V2 E1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ty : ty_e TG (head E1) Ty Ev : eval_e EG (head E1) V @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V V2) * ============================ ty_e [] V Ty
< Ty: case Ty. Subgoal 16: Variables: TG EG Ty V V2 E1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (head E1) V @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V V2) * Ty : ty_e TG E1 (list Ty) ============================ ty_e [] V Ty
< TV: apply IH to Ty Ev1 Rel. Subgoal 16: Variables: TG EG Ty V V2 E1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (head E1) V @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V V2) * Ty : ty_e TG E1 (list Ty) TV : ty_e [] (cons V V2) (list Ty) ============================ ty_e [] V Ty
< case TV. Subgoal 16: Variables: TG EG Ty V V2 E1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (head E1) V @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V V2) * Ty : ty_e TG E1 (list Ty) H1 : ty_e [] V Ty H2 : ty_e [] V2 (list Ty) ============================ ty_e [] V Ty
< search. Subgoal 17: Variables: TG EG Ty V V1 E1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ty : ty_e TG (tail E1) Ty Ev : eval_e EG (tail E1) V @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V1 V) * ============================ ty_e [] V Ty
< Ty: case Ty. Subgoal 17: Variables: TG EG V V1 E1 Ty1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (tail E1) V @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V1 V) * Ty : ty_e TG E1 (list Ty1) ============================ ty_e [] V (list Ty1)
< TV: apply IH to Ty Ev1 Rel. Subgoal 17: Variables: TG EG V V1 E1 Ty1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (tail E1) V @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V1 V) * Ty : ty_e TG E1 (list Ty1) TV : ty_e [] (cons V1 V) (list Ty1) ============================ ty_e [] V (list Ty1)
< case TV. Subgoal 17: Variables: TG EG V V1 E1 Ty1 IH : forall TG EG E Ty V, ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1, lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty Ev : eval_e EG (tail E1) V @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty Ev1 : eval_e EG E1 (cons V1 V) * Ty : ty_e TG E1 (list Ty1) H1 : ty_e [] V1 Ty1 H2 : ty_e [] V (list Ty1) ============================ ty_e [] V (list Ty1)
< search. Proof completed.
< Prove library:host:var_types_maintained. Subgoal 7: Variables: G' X Ty Ty1 E Tl Hd IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty Ty : ty_s G' (splitlist Hd Tl E) G' @ Lkp : lookup G' X Ty Ty1 : ty_e G' E (list Ty1) Ty2 : lookup G' Hd Ty1 Ty3 : lookup G' Tl (list Ty1) ============================ lookup G' X Ty
< search. Proof completed.
< Prove library:host:type_preservation_s. Subgoal 9: Variables: TG EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ty : ty_s TG (splitlist Hd Tl E) TG' Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty LkpV : lookup ((Hd, V1)::((Tl, V2)::GTl)) X V Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd ============================ ty_e [] V Ty
< Ty: case Ty. Subgoal 9: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty LkpV : lookup ((Hd, V1)::((Tl, V2)::GTl)) X V Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) ============================ ty_e [] V Ty
< TyCons: apply type_preservation_e to Ty Ev1 Rel. Subgoal 9: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty LkpV : lookup ((Hd, V1)::((Tl, V2)::GTl)) X V Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyCons : ty_e [] (cons V1 V2) (list Ty1) ============================ ty_e [] V Ty
< TyV: case TyCons. Subgoal 9: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty LkpV : lookup ((Hd, V1)::((Tl, V2)::GTl)) X V Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) ============================ ty_e [] V Ty
< LV: case LkpV. Subgoal 9.1: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist X Tl E) ((X, V)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V V2) Ev2 : X = Tl -> false Ev3 : select (X, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' X Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V Ty1 TyV1 : ty_e [] V2 (list Ty1) ============================ ty_e [] V Ty
< apply lookup_unique to LkpTy Ty1. Subgoal 9.1: Variables: EG TG' X V VHd GHd VTl GTl V2 Tl E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist X Tl E) ((X, V)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty1 Ev1 : eval_e EG E (cons V V2) Ev2 : X = Tl -> false Ev3 : select (X, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' X Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V Ty1 TyV1 : ty_e [] V2 (list Ty1) ============================ ty_e [] V Ty1
< search. Subgoal 9.2: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : lookup ((Tl, V2)::GTl) X V ============================ ty_e [] V Ty
< LV: case LV1. Subgoal 9.2.1: Variables: EG TG' X Ty V VHd GHd VTl GTl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd X E) ((Hd, V1)::((X, V)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V) Ev2 : Hd = X -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (X, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' X (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V (list Ty1) LV : Hd = X -> false ============================ ty_e [] V Ty
< apply lookup_unique to Ty2 LkpTy. Subgoal 9.2.1: Variables: EG TG' X V VHd GHd VTl GTl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd X E) ((Hd, V1)::((X, V)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X (list Ty1) Ev1 : eval_e EG E (cons V1 V) Ev2 : Hd = X -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (X, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' X (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V (list Ty1) LV : Hd = X -> false ============================ ty_e [] V (list Ty1)
< search. Subgoal 9.2.2: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V ============================ ty_e [] V Ty
< assert X = Tl -> false. Subgoal 9.2.2.1: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V ============================ X = Tl -> false
< intros E. Subgoal 9.2.2.1: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V E : X = Tl ============================ false
< case E. Subgoal 9.2.2.1: Variables: EG TG' Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' Tl Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = Tl -> false LV1 : Tl = Tl -> false LV2 : lookup GTl Tl V ============================ false
< backchain LV1. Subgoal 9.2.2: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V H1 : X = Tl -> false ============================ ty_e [] V Ty
< assert X = Hd -> false. Subgoal 9.2.2.2: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V H1 : X = Tl -> false ============================ X = Hd -> false
< intros E. Subgoal 9.2.2.2: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V H1 : X = Tl -> false E : X = Hd ============================ false
< case E. Subgoal 9.2.2.2: Variables: EG TG' Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' Hd Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = Hd -> false LV1 : Tl = Hd -> false LV2 : lookup GTl Hd V H1 : Hd = Tl -> false ============================ false
< backchain LV. Subgoal 9.2.2: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V H1 : X = Tl -> false H2 : X = Hd -> false ============================ ty_e [] V Ty
< L: apply lookup_after_select_before to LV2 Ev4 _. Subgoal 9.2.2: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V H1 : X = Tl -> false H2 : X = Hd -> false L : lookup GHd X V ============================ ty_e [] V Ty
< L': apply lookup_after_select_before to L Ev3 _. Subgoal 9.2.2: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V H1 : X = Tl -> false H2 : X = Hd -> false L : lookup GHd X V L' : lookup EG X V ============================ ty_e [] V Ty
< apply Rel to _ L'. Subgoal 9.2.2: Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1 IH : forall TG EG S TG' EG' X Ty V, ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1, lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty LkpTy : lookup TG' X Ty Ev1 : eval_e EG E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd EG Ev4 : select (Tl, VTl) GTl GHd Ty : ty_e TG' E (list Ty1) Ty1 : lookup TG' Hd Ty1 Ty2 : lookup TG' Tl (list Ty1) TyV : ty_e [] V1 Ty1 TyV1 : ty_e [] V2 (list Ty1) LV : Hd = X -> false LV1 : Tl = X -> false LV2 : lookup GTl X V H1 : X = Tl -> false H2 : X = Hd -> false L : lookup GHd X V L' : lookup EG X V H3 : ty_e [] V Ty ============================ ty_e [] V Ty
< search. Proof completed.
< Prove_Constraint library:host:proj_eval_e. Subgoal 1: Variables: G E' V Hyp : |{e}- null E' ~~> E' Hyp1 : eval_e G (null E') V Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e (null E') ============================ exists V', eval_e G E' V'
< case Hyp1. Subgoal 1.1: Variables: G E' Hyp : |{e}- null E' ~~> E' Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e (null E') H1 : eval_e G E' nil ============================ exists V', eval_e G E' V'
< search. Subgoal 1.2: Variables: G E' V1 V2 Hyp : |{e}- null E' ~~> E' Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e (null E') H1 : eval_e G E' (cons V1 V2) ============================ exists V', eval_e G E' V'
< search. Subgoal 2: Variables: G E' V Hyp : |{e}- head E' ~~> E' Hyp1 : eval_e G (head E') V Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e (head E') ============================ exists V', eval_e G E' V'
< case Hyp1. Subgoal 2: Variables: G E' V V2 Hyp : |{e}- head E' ~~> E' Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e (head E') H1 : eval_e G E' (cons V V2) ============================ exists V', eval_e G E' V'
< search. Subgoal 3: Variables: G E' V Hyp : |{e}- tail E' ~~> E' Hyp1 : eval_e G (tail E') V Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e (tail E') ============================ exists V', eval_e G E' V'
< case Hyp1. Subgoal 3: Variables: G E' V V1 Hyp : |{e}- tail E' ~~> E' Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e (tail E') H1 : eval_e G E' (cons V1 V) ============================ exists V', eval_e G E' V'
< search. Subgoal 4: Variables: G V Hyp : |{e}- nil ~~> trueE Hyp1 : eval_e G nil V Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e nil ============================ exists V', eval_e G trueE V'
< search. Subgoal 5: Variables: G V E2 E1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp1 : eval_e G (cons E1 E2) V Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e (cons E1 E2) ============================ exists V', eval_e G (eq E1 E2) V'
< case Hyp1. Subgoal 5: Variables: G E2 E1 V2 V1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp2 : is_list (is_pair is_string is_e) G Hyp3 : is_e (cons E1 E2) H1 : eval_e G E1 V1 H2 : eval_e G E2 V2 ============================ exists V', eval_e G (eq E1 E2) V'
< case Hyp3. Subgoal 5: Variables: G E2 E1 V2 V1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp2 : is_list (is_pair is_string is_e) G H1 : eval_e G E1 V1 H2 : eval_e G E2 V2 H3 : is_e E1 H4 : is_e E2 ============================ exists V', eval_e G (eq E1 E2) V'
< Is1: apply eval_e_is to _ _ H1. Subgoal 5: Variables: G E2 E1 V2 V1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp2 : is_list (is_pair is_string is_e) G H1 : eval_e G E1 V1 H2 : eval_e G E2 V2 H3 : is_e E1 H4 : is_e E2 Is1 : is_e V1 ============================ exists V', eval_e G (eq E1 E2) V'
< Is2: apply eval_e_is to _ _ H2. Subgoal 5: Variables: G E2 E1 V2 V1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp2 : is_list (is_pair is_string is_e) G H1 : eval_e G E1 V1 H2 : eval_e G E2 V2 H3 : is_e E1 H4 : is_e E2 Is1 : is_e V1 Is2 : is_e V2 ============================ exists V', eval_e G (eq E1 E2) V'
< Or: apply is_e_eq_or_not to Is1 Is2. Subgoal 5: Variables: G E2 E1 V2 V1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp2 : is_list (is_pair is_string is_e) G H1 : eval_e G E1 V1 H2 : eval_e G E2 V2 H3 : is_e E1 H4 : is_e E2 Is1 : is_e V1 Is2 : is_e V2 Or : V1 = V2 \/ (V1 = V2 -> false) ============================ exists V', eval_e G (eq E1 E2) V'
< E: case Or. Subgoal 5.1: Variables: G E2 E1 V2 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp2 : is_list (is_pair is_string is_e) G H1 : eval_e G E1 V2 H2 : eval_e G E2 V2 H3 : is_e E1 H4 : is_e E2 Is1 : is_e V2 Is2 : is_e V2 ============================ exists V', eval_e G (eq E1 E2) V'
< search. Subgoal 5.2: Variables: G E2 E1 V2 V1 Hyp : |{e}- cons E1 E2 ~~> eq E1 E2 Hyp2 : is_list (is_pair is_string is_e) G H1 : eval_e G E1 V1 H2 : eval_e G E2 V2 H3 : is_e E1 H4 : is_e E2 Is1 : is_e V1 Is2 : is_e V2 E : V1 = V2 -> false ============================ exists V', eval_e G (eq E1 E2) V'
< search. Proof completed.
< Prove library:host:eval_e_unique. Subgoal 12: Variables: G V2 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G nil nil @ Ev2 : eval_e G nil V2 ============================ nil = V2
< case Ev2. Subgoal 12: Variables: G IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G nil nil @ ============================ nil = nil
< search. Subgoal 13: 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 Ev1 : eval_e G (cons E1 E2) (cons V3 V4) @ Ev2 : eval_e G (cons E1 E2) V2 Ev3 : eval_e G E1 V3 * Ev4 : eval_e G E2 V4 * ============================ cons V3 V4 = V2
< Ev2: case Ev2. Subgoal 13: 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 Ev1 : eval_e G (cons E1 E2) (cons 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 ============================ cons V3 V4 = cons V5 V6
< apply IH to Ev3 Ev2. Subgoal 13: 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 Ev1 : eval_e G (cons E1 E2) (cons 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 ============================ cons V5 V4 = cons V5 V6
< apply IH to Ev4 Ev5. Subgoal 13: Variables: G E2 E1 V6 V5 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (cons E1 E2) (cons 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 ============================ cons V5 V6 = cons V5 V6
< search. Subgoal 14: Variables: G V2 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (null E1) trueE @ Ev2 : eval_e G (null E1) V2 Ev3 : eval_e G E1 nil * ============================ trueE = V2
< Ev2: case Ev2. Subgoal 14.1: Variables: G E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (null E1) trueE @ Ev3 : eval_e G E1 nil * Ev2 : eval_e G E1 nil ============================ trueE = trueE
< search. Subgoal 14.2: Variables: G E1 V3 V4 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (null E1) trueE @ Ev3 : eval_e G E1 nil * Ev2 : eval_e G E1 (cons V3 V4) ============================ trueE = falseE
< apply IH to Ev3 Ev2. Subgoal 15: Variables: G V2 V3 V4 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (null E1) falseE @ Ev2 : eval_e G (null E1) V2 Ev3 : eval_e G E1 (cons V3 V4) * ============================ falseE = V2
< Ev2: case Ev2. Subgoal 15.1: Variables: G V3 V4 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (null E1) falseE @ Ev3 : eval_e G E1 (cons V3 V4) * Ev2 : eval_e G E1 nil ============================ falseE = trueE
< apply IH to Ev3 Ev2. Subgoal 15.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 Ev1 : eval_e G (null E1) falseE @ Ev3 : eval_e G E1 (cons V3 V4) * Ev2 : eval_e G E1 (cons V5 V6) ============================ falseE = falseE
< search. Subgoal 16: Variables: G V1 V2 V3 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (head E1) V1 @ Ev2 : eval_e G (head E1) V2 Ev3 : eval_e G E1 (cons V1 V3) * ============================ V1 = V2
< Ev2: case Ev2. Subgoal 16: 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 Ev1 : eval_e G (head E1) V1 @ Ev3 : eval_e G E1 (cons V1 V3) * Ev2 : eval_e G E1 (cons V2 V4) ============================ V1 = V2
< apply IH to Ev3 Ev2. Subgoal 16: Variables: G V2 E1 V4 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (head E1) V2 @ Ev3 : eval_e G E1 (cons V2 V4) * Ev2 : eval_e G E1 (cons V2 V4) ============================ V2 = V2
< search. Subgoal 17: Variables: G V1 V2 V3 E1 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (tail E1) V1 @ Ev2 : eval_e G (tail E1) V2 Ev3 : eval_e G E1 (cons V3 V1) * ============================ V1 = V2
< Ev2: case Ev2. Subgoal 17: 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 Ev1 : eval_e G (tail E1) V1 @ Ev3 : eval_e G E1 (cons V3 V1) * Ev2 : eval_e G E1 (cons V4 V2) ============================ V1 = V2
< apply IH to Ev3 Ev2. Subgoal 17: Variables: G V2 E1 V4 IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2 Ev1 : eval_e G (tail E1) V2 @ Ev3 : eval_e G E1 (cons V4 V2) * Ev2 : eval_e G E1 (cons V4 V2) ============================ V2 = V2
< search. Proof completed.
< Prove_Constraint library:host:proj_s_eval. Variables: G G2 Hd Tl E Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G2 Hyp2 : Hd = Tl -> false ============================ exists G', eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G'
< Ev: case Hyp1. Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ exists G', eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G'
< exists (Hd, V1)::((Tl, V2)::GTl). Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) ((Hd, V1)::((Tl, V2)::GTl))
< unfold . Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ exists G1, eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) G1 /\ eval_s G1 (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
< exists (Tl, V2)::((Hd, cons V1 V2)::GTl). Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) ((Tl, V2)::((Hd, cons V1 V2)::GTl)) /\ eval_s ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
< split. Subgoal 1: Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
< unfold . Subgoal 1: Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ exists G1, eval_s G (assign Hd E) G1 /\ eval_s G1 (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
< exists (Hd, cons V1 V2)::GHd. Subgoal 1: Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ eval_s G (assign Hd E) ((Hd, cons V1 V2)::GHd) /\ eval_s ((Hd, cons V1 V2)::GHd) (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
< split. Subgoal 1.1: Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ eval_s G (assign Hd E) ((Hd, cons V1 V2)::GHd)
< search. Subgoal 1.2: Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ eval_s ((Hd, cons V1 V2)::GHd) (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
< search. Subgoal 2: Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ eval_s ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
< assert Tl = Hd -> false. Subgoal 2.1: Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd ============================ Tl = Hd -> false
< intros E. Subgoal 2.1: Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd E : Tl = Hd ============================ false
< case E. Subgoal 2.1: Variables: G Hd E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Hd E ~~> seq (seq (assign Hd E) (assign Hd (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Hd -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Hd -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Hd, VTl) GTl GHd ============================ false
< backchain Ev1. Subgoal 2: Variables: G Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : Hd = Tl -> false Ev : eval_e G E (cons V1 V2) Ev1 : Hd = Tl -> false Ev2 : select (Hd, VHd) GHd G Ev3 : select (Tl, VTl) GTl GHd H1 : Tl = Hd -> false ============================ eval_s ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
< search. Proof completed.
< Add_Ext_Size library:host:eval_s. Proof completed.
< Add_Proj_Rel library:host:eval_s. Proof completed.
< Prove_Ext_Ind library:host:eval_s. Subgoal 9: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd ============================ <eval_s {P}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl))
< assert |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))). Subgoal 9: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ <eval_s {P}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl))
< unfold . Subgoal 9: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ exists T VHd GHd VTl, (eval_e G E (cons V1 V2) /\ ((Hd = Tl -> false) /\ (select (Hd, VHd) GHd G /\ select (Tl, VTl) GTl GHd))) /\ (|{s}- splitlist Hd Tl E ~~> T /\ <eval_s {P}> G T ((Hd, V1)::((Tl, V2)::GTl)))
< exists seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))), VHd, GHd, VTl. Subgoal 9: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ (eval_e G E (cons V1 V2) /\ ((Hd = Tl -> false) /\ (select (Hd, VHd) GHd G /\ select (Tl, VTl) GTl GHd))) /\ (|{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) /\ <eval_s {P}> G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) ((Hd, V1)::((Tl, V2)::GTl)))
< split. Subgoal 9.1: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ eval_e G E (cons V1 V2)
< search. Subgoal 9.2: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ Hd = Tl -> false
< search. Subgoal 9.3: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ select (Hd, VHd) GHd G
< search. Subgoal 9.4: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ select (Tl, VTl) GTl GHd
< search. Subgoal 9.5: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
< search. Subgoal 9.6: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ <eval_s {P}> G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) ((Hd, V1)::((Tl, V2)::GTl))
< unfold . Subgoal 9.6: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ exists G1, <eval_s {P}> G (seq (assign Hd E) (assign Tl (tail (var Hd)))) G1 /\ <eval_s {P}> G1 (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
< exists (Tl, V2)::((Hd, cons V1 V2)::GTl). Subgoal 9.6: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ <eval_s {P}> G (seq (assign Hd E) (assign Tl (tail (var Hd)))) ((Tl, V2)::((Hd, cons V1 V2)::GTl)) /\ <eval_s {P}> ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
< split. Subgoal 9.6.1: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ <eval_s {P}> G (seq (assign Hd E) (assign Tl (tail (var Hd)))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
< unfold . Subgoal 9.6.1: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ exists G1, <eval_s {P}> G (assign Hd E) G1 /\ <eval_s {P}> G1 (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
< exists (Hd, cons V1 V2)::GHd. Subgoal 9.6.1: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ <eval_s {P}> G (assign Hd E) ((Hd, cons V1 V2)::GHd) /\ <eval_s {P}> ((Hd, cons V1 V2)::GHd) (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
< split. Subgoal 9.6.1.1: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ <eval_s {P}> G (assign Hd E) ((Hd, cons V1 V2)::GHd)
< search. Subgoal 9.6.1.2: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ <eval_s {P}> ((Hd, cons V1 V2)::GHd) (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
< search. Subgoal 9.6.2: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ <eval_s {P}> ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
< assert Tl = Hd -> false. Subgoal 9.6.2.1: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ Tl = Hd -> false
< intros E. Subgoal 9.6.2.1: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) E : Tl = Hd ============================ false
< case E. Subgoal 9.6.2.1: Variables: G VHd GHd VTl GTl V2 V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Hd E) ((Hd, V1)::((Hd, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Hd -> false R3 : select (Hd, VHd) GHd G R4 : select (Hd, VTl) GTl GHd H1 : |{s}- splitlist Hd Hd E ~~> seq (seq (assign Hd E) (assign Hd (tail (var Hd)))) (assign Hd (head (var Hd))) ============================ false
< backchain R2. Subgoal 9.6.2: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1 IH1 : forall N G S G1, <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1 R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@ Acc : acc 1 @ R1 : eval_e G E (cons V1 V2) R2 : Hd = Tl -> false R3 : select (Hd, VHd) GHd G R4 : select (Tl, VTl) GTl GHd H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) H2 : Tl = Hd -> false ============================ <eval_s {P}> ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
< search. Proof completed.
< Prove_Constraint library:host:proj_s_eval_results. Variables: G G1 G2 X V Hd Tl E Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp2 : eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G2 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false ============================ lookup G2 X V
< EvTr: case Hyp2. Variables: G G1 G2 X V Hd Tl E G3 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr : eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) G3 EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2 ============================ lookup G2 X V
< EvTr: case EvTr. Variables: G G1 G2 X V Hd Tl E G3 G4 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2 EvTr : eval_s G (assign Hd E) G4 EvTr2 : eval_s G4 (assign Tl (tail (var Hd))) G3 ============================ lookup G2 X V
< EvTr: case EvTr. Variables: G G1 G2 X V Hd Tl E G3 VOld NewG V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2 EvTr2 : eval_s ((Hd, V1)::NewG) (assign Tl (tail (var Hd))) G3 EvTr : eval_e G E V1 EvTr3 : select (Hd, VOld) NewG G ============================ lookup G2 X V
< EvTr: case EvTr2. Variables: G G1 G2 X V Hd Tl E VOld NewG V1 VOld1 NewG1 V2 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2 EvTr : eval_e G E V1 EvTr3 : select (Hd, VOld) NewG G EvTr2 : eval_e ((Hd, V1)::NewG) (tail (var Hd)) V2 EvTr4 : select (Tl, VOld1) NewG1 ((Hd, V1)::NewG) ============================ lookup G2 X V
< EvTr: case EvTr2. Variables: G G1 G2 X V Hd Tl E VOld NewG V1 VOld1 NewG1 V2 V3 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2 EvTr : eval_e G E V1 EvTr3 : select (Hd, VOld) NewG G EvTr4 : select (Tl, VOld1) NewG1 ((Hd, V1)::NewG) EvTr2 : eval_e ((Hd, V1)::NewG) (var Hd) (cons V3 V2) ============================ lookup G2 X V
< EvTr: case EvTr2. Variables: G G1 G2 X V Hd Tl E VOld NewG V1 VOld1 NewG1 V2 V3 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2 EvTr : eval_e G E V1 EvTr3 : select (Hd, VOld) NewG G EvTr4 : select (Tl, VOld1) NewG1 ((Hd, V1)::NewG) EvTr2 : lookup ((Hd, V1)::NewG) Hd (cons V3 V2) ============================ lookup G2 X V
< case EvTr2. Subgoal 1: Variables: G G1 G2 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2 EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG) ============================ lookup G2 X V
< EvTr: case EvTr1. Subgoal 1: Variables: G G1 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3 VOld2 NewG2 V4 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG) EvTr1 : eval_e ((Tl, V2)::NewG1) (head (var Hd)) V4 EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::NewG1) ============================ lookup ((Hd, V4)::NewG2) X V
< EvTr: case EvTr1. Subgoal 1: Variables: G G1 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3 VOld2 NewG2 V4 V5 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG) EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::NewG1) EvTr1 : eval_e ((Tl, V2)::NewG1) (var Hd) (cons V4 V5) ============================ lookup ((Hd, V4)::NewG2) X V
< EvTr: case EvTr1. Subgoal 1: Variables: G G1 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3 VOld2 NewG2 V4 V5 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG) EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::NewG1) EvTr1 : lookup ((Tl, V2)::NewG1) Hd (cons V4 V5) ============================ lookup ((Hd, V4)::NewG2) X V
< L: case EvTr1. Subgoal 1.1: Variables: G G1 X V Hd E VOld NewG VOld1 NewG1 V3 VOld2 NewG2 V4 V5 Hyp : |{s}- splitlist Hd Hd E ~~> seq (seq (assign Hd E) (assign Hd (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Hd E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Hd -> false EvTr : eval_e G E (cons V3 (cons V4 V5)) EvTr3 : select (Hd, VOld) NewG G EvTr4 : select (Hd, VOld1) NewG1 ((Hd, cons V3 (cons V4 V5))::NewG) EvTr2 : select (Hd, VOld2) NewG2 ((Hd, cons V4 V5)::NewG1) ============================ lookup ((Hd, V4)::NewG2) X V
< apply Hyp4 to _. Subgoal 1.2: Variables: G G1 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3 VOld2 NewG2 V4 V5 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG) EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::NewG1) L : Tl = Hd -> false L1 : lookup NewG1 Hd (cons V4 V5) ============================ lookup ((Hd, V4)::NewG2) X V
< STl: case EvTr4. Subgoal 1.2.1: Variables: G G1 X V Hd E VOld NewG V2 V3 VOld2 NewG2 V4 V5 Hyp : |{s}- splitlist Hd Hd E ~~> seq (seq (assign Hd E) (assign Hd (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Hd E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Hd -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G EvTr2 : select (Hd, VOld2) NewG2 ((Hd, V2)::NewG) L : Hd = Hd -> false L1 : lookup NewG Hd (cons V4 V5) ============================ lookup ((Hd, V4)::NewG2) X V
< apply L to _. Subgoal 1.2.2: Variables: G G1 X V Hd Tl E VOld NewG VOld1 V2 V3 VOld2 NewG2 V4 V5 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::((Hd, cons V3 V2)::L1)) L : Tl = Hd -> false L1 : lookup ((Hd, cons V3 V2)::L1) Hd (cons V4 V5) STl : select (Tl, VOld1) L1 NewG ============================ lookup ((Hd, V4)::NewG2) X V
< SHd: case EvTr2. Subgoal 1.2.2.1: Variables: G G1 X V Tl E VOld NewG VOld1 V2 V3 V4 V5 L1 Hyp : |{s}- splitlist Tl Tl E ~~> seq (seq (assign Tl E) (assign Tl (tail (var Tl)))) (assign Tl (head (var Tl))) Hyp1 : eval_s G (splitlist Tl Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Tl = Tl -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Tl, VOld) NewG G L : Tl = Tl -> false L1 : lookup ((Tl, cons V3 V2)::L1) Tl (cons V4 V5) STl : select (Tl, VOld1) L1 NewG ============================ lookup ((Tl, V4)::((Tl, cons V3 V2)::L1)) X V
< apply L to _. Subgoal 1.2.2.2: Variables: G G1 X V Hd Tl E VOld NewG VOld1 V2 V3 VOld2 V4 V5 L1 L2 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false L1 : lookup ((Hd, cons V3 V2)::L1) Hd (cons V4 V5) STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V3 V2)::L1) ============================ lookup ((Hd, V4)::((Tl, V2)::L2)) X V
< EvSL: case Hyp1. Subgoal 1.2.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 V2 V3 VOld2 V4 V5 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V6)::((Tl, V7)::GTl)) X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false L1 : lookup ((Hd, cons V3 V2)::L1) Hd (cons V4 V5) STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V3 V2)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd ============================ lookup ((Hd, V4)::((Tl, V2)::L2)) X V
< case L1. Subgoal 1.2.2.2.1: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 V4 V5 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V6)::((Tl, V7)::GTl)) X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V4 V5) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V4 V5)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd ============================ lookup ((Hd, V4)::((Tl, V5)::L2)) X V
< apply eval_e_unique to EvTr EvSL. Subgoal 1.2.2.2.1: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V6)::((Tl, V7)::GTl)) X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< LX: case Hyp3. Subgoal 1.2.2.2.1.1: Variables: G X V Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X))) Hyp4 : X = Tl -> false EvTr : eval_e G E (cons V V7) EvTr3 : select (X, VOld) NewG G L : Tl = X -> false STl : select (Tl, VOld1) L1 NewG SHd : select (X, VOld2) L2 ((X, cons V V7)::L1) EvSL : eval_e G E (cons V V7) EvSL1 : X = Tl -> false EvSL2 : select (X, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd ============================ lookup ((X, V)::((Tl, V7)::L2)) X V
< search. Subgoal 1.2.2.2.1.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : lookup ((Tl, V7)::GTl) X V ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< LX: case LX1. Subgoal 1.2.2.2.1.2.1: Variables: G X V Hd E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V6 Hyp : |{s}- splitlist Hd X E ~~> seq (seq (assign Hd E) (assign X (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = X -> false EvTr : eval_e G E (cons V6 V) EvTr3 : select (Hd, VOld) NewG G L : X = Hd -> false STl : select (X, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V)::L1) EvSL : eval_e G E (cons V6 V) EvSL1 : Hd = X -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (X, VTl) GTl GHd LX : Hd = X -> false ============================ lookup ((Hd, V6)::((X, V)::L2)) X V
< search. Subgoal 1.2.2.2.1.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< assert X = Tl -> false. Subgoal 1.2.2.2.1.2.2.1: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V ============================ X = Tl -> false
< intros E. Subgoal 1.2.2.2.1.2.2.1: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V E : X = Tl ============================ false
< case E. Subgoal 1.2.2.2.1.2.2.1: Variables: G V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = Tl -> false LX1 : Tl = Tl -> false LX2 : lookup GTl Tl V ============================ false
< backchain LX1. Subgoal 1.2.2.2.1.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< L2: apply lookup_after_select_before to LX2 EvSL3 _. Subgoal 1.2.2.2.1.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false L2 : lookup GHd X V ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< assert X = Hd -> false. Subgoal 1.2.2.2.1.2.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false L2 : lookup GHd X V ============================ X = Hd -> false
< intros E. Subgoal 1.2.2.2.1.2.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false L2 : lookup GHd X V E : X = Hd ============================ false
< case E. Subgoal 1.2.2.2.1.2.2.2: Variables: G V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = Hd -> false LX1 : Tl = Hd -> false LX2 : lookup GTl Hd V H1 : Hd = Tl -> false L2 : lookup GHd Hd V ============================ false
< backchain LX. Subgoal 1.2.2.2.1.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false L2 : lookup GHd X V H2 : X = Hd -> false ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< L3: apply lookup_after_select_before to L2 EvSL2 _. Subgoal 1.2.2.2.1.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false L2 : lookup GHd X V H2 : X = Hd -> false L3 : lookup G X V ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< L4: apply select_lookup to L3 EvTr3 _. Subgoal 1.2.2.2.1.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false L2 : lookup GHd X V H2 : X = Hd -> false L3 : lookup G X V L4 : lookup NewG X V ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< L5: apply select_lookup to L4 STl _. Subgoal 1.2.2.2.1.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false L2 : lookup GHd X V H2 : X = Hd -> false L3 : lookup G X V L4 : lookup NewG X V L5 : lookup L1 X V ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< L5': assert lookup ((Hd, cons V6 V7)::L1) X V. Subgoal 1.2.2.2.1.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false L2 : lookup GHd X V H2 : X = Hd -> false L3 : lookup G X V L4 : lookup NewG X V L5 : lookup L1 X V L5' : lookup ((Hd, cons V6 V7)::L1) X V ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< apply select_lookup to L5' SHd _. Subgoal 1.2.2.2.1.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V6 V7) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup GTl X V H1 : X = Tl -> false L2 : lookup GHd X V H2 : X = Hd -> false L3 : lookup G X V L4 : lookup NewG X V L5 : lookup L1 X V L5' : lookup ((Hd, cons V6 V7)::L1) X V H3 : lookup L2 X V ============================ lookup ((Hd, V6)::((Tl, V7)::L2)) X V
< search. Subgoal 1.2.2.2.2: Variables: G X V Hd Tl E VOld NewG VOld1 V2 V3 VOld2 V4 V5 L1 L2 VHd GHd VTl GTl V7 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V6)::((Tl, V7)::GTl)) X V Hyp4 : Hd = Tl -> false EvTr : eval_e G E (cons V3 V2) EvTr3 : select (Hd, VOld) NewG G L : Tl = Hd -> false STl : select (Tl, VOld1) L1 NewG SHd : select (Hd, VOld2) L2 ((Hd, cons V3 V2)::L1) EvSL : eval_e G E (cons V6 V7) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd H1 : Hd = Hd -> false H2 : lookup L1 Hd (cons V4 V5) ============================ lookup ((Hd, V4)::((Tl, V2)::L2)) X V
< apply H1 to _. Subgoal 2: Variables: G G1 G2 X V Hd Tl E VOld NewG V1 VOld1 NewG1 V2 V3 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp3 : lookup G1 X V Hyp4 : Hd = Tl -> false EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2 EvTr : eval_e G E V1 EvTr3 : select (Hd, VOld) NewG G EvTr4 : select (Tl, VOld1) NewG1 ((Hd, V1)::NewG) H1 : Hd = Hd -> false H2 : lookup NewG Hd (cons V3 V2) ============================ lookup G2 X V
< apply H1 to _. Proof completed.
< Prove_Constraint library:host:proj_s_eval_results_back. Variables: G G1 G2 X V Hd Tl E Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp1 : eval_s G (splitlist Hd Tl E) G1 Hyp2 : eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G2 Hyp3 : lookup G2 X V Hyp4 : Hd = Tl -> false ============================ lookup G1 X V
< EvSL: case Hyp1. Variables: G G2 X V Hd Tl E VHd GHd VTl GTl V2 V1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp2 : eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G2 Hyp3 : lookup G2 X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< EvTr: case Hyp2. Variables: G G2 X V Hd Tl E VHd GHd VTl GTl V2 V1 G3 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup G2 X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) G3 EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2 ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< EvTr: case EvTr. Variables: G G2 X V Hd Tl E VHd GHd VTl GTl V2 V1 G3 G4 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup G2 X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2 EvTr : eval_s G (assign Hd E) G4 EvTr2 : eval_s G4 (assign Tl (tail (var Hd))) G3 ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< EvTr: case EvTr1. Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 G3 G4 VOld NewG V3 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_s G (assign Hd E) G4 EvTr2 : eval_s G4 (assign Tl (tail (var Hd))) G3 EvTr1 : eval_e G3 (head (var Hd)) V3 EvTr3 : select (Hd, VOld) NewG G3 ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< EvTr: case EvTr. Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 G3 VOld NewG V3 VOld1 NewG1 V4 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr2 : eval_s ((Hd, V4)::NewG1) (assign Tl (tail (var Hd))) G3 EvTr1 : eval_e G3 (head (var Hd)) V3 EvTr3 : select (Hd, VOld) NewG G3 EvTr : eval_e G E V4 EvTr4 : select (Hd, VOld1) NewG1 G ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< apply eval_e_unique to EvTr EvSL. Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 G3 VOld NewG V3 VOld1 NewG1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr2 : eval_s ((Hd, cons V1 V2)::NewG1) (assign Tl (tail (var Hd))) G3 EvTr1 : eval_e G3 (head (var Hd)) V3 EvTr3 : select (Hd, VOld) NewG G3 EvTr : eval_e G E (cons V1 V2) EvTr4 : select (Hd, VOld1) NewG1 G ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< EvTr: case EvTr2. Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr1 : eval_e ((Tl, V5)::NewG2) (head (var Hd)) V3 EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2) EvTr : eval_e G E (cons V1 V2) EvTr4 : select (Hd, VOld1) NewG1 G EvTr2 : eval_e ((Hd, cons V1 V2)::NewG1) (tail (var Hd)) V5 EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1) ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< EvTr: case EvTr1. Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2) EvTr : eval_e G E (cons V1 V2) EvTr4 : select (Hd, VOld1) NewG1 G EvTr2 : eval_e ((Hd, cons V1 V2)::NewG1) (tail (var Hd)) V5 EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1) EvTr1 : eval_e ((Tl, V5)::NewG2) (var Hd) (cons V3 V6) ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< EvTr: case EvTr2. Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2) EvTr : eval_e G E (cons V1 V2) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1) EvTr1 : eval_e ((Tl, V5)::NewG2) (var Hd) (cons V3 V6) EvTr2 : eval_e ((Hd, cons V1 V2)::NewG1) (var Hd) (cons V7 V5) ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< EvTr: case EvTr1. Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2) EvTr : eval_e G E (cons V1 V2) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1) EvTr2 : eval_e ((Hd, cons V1 V2)::NewG1) (var Hd) (cons V7 V5) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< EvTr: case EvTr2. Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2) EvTr : eval_e G E (cons V1 V2) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : lookup ((Hd, cons V1 V2)::NewG1) Hd (cons V7 V5) ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< LHd: case EvTr2. Subgoal 1: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2) EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< EvTr: case EvTr3. Subgoal 1.1: Variables: G X V Tl E VHd GHd VTl GTl V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 Hyp : |{s}- splitlist Tl Tl E ~~> seq (seq (assign Tl E) (assign Tl (tail (var Tl)))) (assign Tl (head (var Tl))) Hyp3 : lookup ((Tl, V3)::NewG2) X V Hyp4 : Tl = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Tl = Tl -> false EvSL2 : select (Tl, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Tl, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Tl, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Tl (cons V3 V6) ============================ lookup ((Tl, V7)::((Tl, V5)::GTl)) X V
< apply EvSL1 to _. Subgoal 1.2: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::((Tl, V5)::L1)) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< LX: case Hyp3. Subgoal 1.2.1: Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X))) Hyp4 : X = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : X = Tl -> false EvSL2 : select (X, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (X, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((X, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) X (cons V V6) EvTr2 : select (X, VOld) L1 NewG2 ============================ lookup ((X, V7)::((Tl, V5)::GTl)) X V
< STl: case EvTr5. Subgoal 1.2.1.1: Variables: G X V E VHd GHd VTl GTl VOld VOld1 NewG1 V5 V6 V7 L1 Hyp : |{s}- splitlist X X E ~~> seq (seq (assign X E) (assign X (tail (var X)))) (assign X (head (var X))) Hyp4 : X = X -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : X = X -> false EvSL2 : select (X, VHd) GHd G EvSL3 : select (X, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (X, VOld1) NewG1 G EvTr1 : lookup ((X, V5)::NewG1) X (cons V V6) EvTr2 : select (X, VOld) L1 NewG1 ============================ lookup ((X, V7)::((X, V5)::GTl)) X V
< apply EvSL1 to _. Subgoal 1.2.1.2: Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V5 V6 V7 L1 L2 Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X))) Hyp4 : X = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : X = Tl -> false EvSL2 : select (X, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (X, VOld1) NewG1 G EvTr1 : lookup ((Tl, V5)::((X, cons V7 V5)::L2)) X (cons V V6) EvTr2 : select (X, VOld) L1 ((X, cons V7 V5)::L2) STl : select (Tl, VOld2) L2 NewG1 ============================ lookup ((X, V7)::((Tl, V5)::GTl)) X V
< L: case EvTr1. Subgoal 1.2.1.2.1: Variables: G X V E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V6 V7 L1 L2 Hyp : |{s}- splitlist X X E ~~> seq (seq (assign X E) (assign X (tail (var X)))) (assign X (head (var X))) Hyp4 : X = X -> false EvSL : eval_e G E (cons V7 (cons V V6)) EvSL1 : X = X -> false EvSL2 : select (X, VHd) GHd G EvSL3 : select (X, VTl) GTl GHd EvTr : eval_e G E (cons V7 (cons V V6)) EvTr4 : select (X, VOld1) NewG1 G EvTr2 : select (X, VOld) L1 ((X, cons V7 (cons V V6))::L2) STl : select (X, VOld2) L2 NewG1 ============================ lookup ((X, V7)::((X, cons V V6)::GTl)) X V
< apply EvSL1 to _. Subgoal 1.2.1.2.2: Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V5 V6 V7 L1 L2 Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X))) Hyp4 : X = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : X = Tl -> false EvSL2 : select (X, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (X, VOld1) NewG1 G EvTr2 : select (X, VOld) L1 ((X, cons V7 V5)::L2) STl : select (Tl, VOld2) L2 NewG1 L : Tl = X -> false L1 : lookup ((X, cons V7 V5)::L2) X (cons V V6) ============================ lookup ((X, V7)::((Tl, V5)::GTl)) X V
< L': case L1. Subgoal 1.2.1.2.2.1: Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V6 L1 L2 Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X))) Hyp4 : X = Tl -> false EvSL : eval_e G E (cons V V6) EvSL1 : X = Tl -> false EvSL2 : select (X, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V V6) EvTr4 : select (X, VOld1) NewG1 G EvTr2 : select (X, VOld) L1 ((X, cons V V6)::L2) STl : select (Tl, VOld2) L2 NewG1 L : Tl = X -> false ============================ lookup ((X, V)::((Tl, V6)::GTl)) X V
< search. Subgoal 1.2.1.2.2.2: Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V5 V6 V7 L1 L2 Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X))) Hyp4 : X = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : X = Tl -> false EvSL2 : select (X, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (X, VOld1) NewG1 G EvTr2 : select (X, VOld) L1 ((X, cons V7 V5)::L2) STl : select (Tl, VOld2) L2 NewG1 L : Tl = X -> false L' : X = X -> false L'1 : lookup L2 X (cons V V6) ============================ lookup ((X, V7)::((Tl, V5)::GTl)) X V
< apply L' to _. Subgoal 1.2.2: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : lookup ((Tl, V5)::L1) X V ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< LX: case LX1. Subgoal 1.2.2.1: Variables: G X V Hd E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V6 V7 L1 Hyp : |{s}- splitlist Hd X E ~~> seq (seq (assign Hd E) (assign X (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = X -> false EvSL : eval_e G E (cons V7 V) EvSL1 : Hd = X -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (X, VTl) GTl GHd EvTr : eval_e G E (cons V7 V) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (X, VOld2) NewG2 ((Hd, cons V7 V)::NewG1) EvTr1 : lookup ((X, V)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false ============================ lookup ((Hd, V7)::((X, V)::GTl)) X V
< search. Subgoal 1.2.2.2: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< assert X = Hd -> false. Subgoal 1.2.2.2.1: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V ============================ X = Hd -> false
< intros E. Subgoal 1.2.2.2.1: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V E : X = Hd ============================ false
< case E. Subgoal 1.2.2.2.1: Variables: G V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = Hd -> false LX1 : Tl = Hd -> false LX2 : lookup L1 Hd V ============================ false
< backchain LX. Subgoal 1.2.2.2: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< assert X = Tl -> false. Subgoal 1.2.2.2.2: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false ============================ X = Tl -> false
< intros E. Subgoal 1.2.2.2.2: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false E : X = Tl ============================ false
< case E. Subgoal 1.2.2.2.2: Variables: G V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = Tl -> false LX1 : Tl = Tl -> false LX2 : lookup L1 Tl V H1 : Tl = Hd -> false ============================ false
< backchain LX1. Subgoal 1.2.2.2: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false H2 : X = Tl -> false ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< L1: apply lookup_after_select_before to LX2 EvTr2 _. Subgoal 1.2.2.2: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false H2 : X = Tl -> false L1 : lookup NewG2 X V ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< L2: apply lookup_after_select_before to L1 EvTr5 _. Subgoal 1.2.2.2: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false H2 : X = Tl -> false L1 : lookup NewG2 X V L2 : lookup ((Hd, cons V7 V5)::NewG1) X V ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< L': case L2. Subgoal 1.2.2.2.3: Variables: G X Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X))) Hyp4 : X = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : X = Tl -> false EvSL2 : select (X, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (X, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((X, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) X (cons V3 V6) EvTr2 : select (X, VOld) L1 NewG2 LX : X = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X (cons V7 V5) H1 : X = X -> false H2 : X = Tl -> false L1 : lookup NewG2 X (cons V7 V5) ============================ lookup ((X, V7)::((Tl, V5)::GTl)) X (cons V7 V5)
< apply LX to _. Subgoal 1.2.2.2.4: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false H2 : X = Tl -> false L1 : lookup NewG2 X V L' : Hd = X -> false L'1 : lookup NewG1 X V ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< L3: apply lookup_after_select_before to L'1 EvTr4 _. Subgoal 1.2.2.2.4: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false H2 : X = Tl -> false L1 : lookup NewG2 X V L' : Hd = X -> false L'1 : lookup NewG1 X V L3 : lookup G X V ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< L4: apply select_lookup to L3 EvSL2 _. Subgoal 1.2.2.2.4: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false H2 : X = Tl -> false L1 : lookup NewG2 X V L' : Hd = X -> false L'1 : lookup NewG1 X V L3 : lookup G X V L4 : lookup GHd X V ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< apply select_lookup to L4 EvSL3 _. Subgoal 1.2.2.2.4: Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V7 V5) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr : eval_e G E (cons V7 V5) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) EvTr2 : select (Hd, VOld) L1 NewG2 LX : Hd = X -> false LX1 : Tl = X -> false LX2 : lookup L1 X V H1 : X = Hd -> false H2 : X = Tl -> false L1 : lookup NewG2 X V L' : Hd = X -> false L'1 : lookup NewG1 X V L3 : lookup G X V L4 : lookup GHd X V H3 : lookup GTl X V ============================ lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
< search. Subgoal 2: Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) Hyp3 : lookup ((Hd, V3)::NewG) X V Hyp4 : Hd = Tl -> false EvSL : eval_e G E (cons V1 V2) EvSL1 : Hd = Tl -> false EvSL2 : select (Hd, VHd) GHd G EvSL3 : select (Tl, VTl) GTl GHd EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2) EvTr : eval_e G E (cons V1 V2) EvTr4 : select (Hd, VOld1) NewG1 G EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1) EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6) LHd : Hd = Hd -> false LHd1 : lookup NewG1 Hd (cons V7 V5) ============================ lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
< apply LHd to _. Proof completed.
< Prove library:host:eval_e_value. Subgoal 12: Variables: G IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G nil nil @ AllVal : forall X XV, mem (X, XV) G -> value XV ============================ value nil
< search. Subgoal 13: Variables: G V2 V1 E2 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (cons E1 E2) (cons V1 V2) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 V1 * Ev2 : eval_e G E2 V2 * ============================ value (cons V1 V2)
< apply IH to Ev1 AllVal. Subgoal 13: Variables: G V2 V1 E2 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (cons E1 E2) (cons V1 V2) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 V1 * Ev2 : eval_e G E2 V2 * H1 : value V1 ============================ value (cons V1 V2)
< apply IH to Ev2 AllVal. Subgoal 13: Variables: G V2 V1 E2 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (cons E1 E2) (cons V1 V2) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 V1 * Ev2 : eval_e G E2 V2 * H1 : value V1 H2 : value V2 ============================ value (cons V1 V2)
< search. Subgoal 14: Variables: G E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (null E1) trueE @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 nil * ============================ value trueE
< search. Subgoal 15: Variables: G V1 V2 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (null E1) falseE @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 (cons V1 V2) * ============================ value falseE
< search. Subgoal 16: Variables: G V V2 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (head E1) V @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 (cons V V2) * ============================ value V
< V: apply IH to Ev1 AllVal. Subgoal 16: Variables: G V V2 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (head E1) V @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 (cons V V2) * V : value (cons V V2) ============================ value V
< case V. Subgoal 16: Variables: G V V2 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (head E1) V @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 (cons V V2) * H1 : value V H2 : value V2 ============================ value V
< search. Subgoal 17: Variables: G V V1 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (tail E1) V @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 (cons V1 V) * ============================ value V
< V: apply IH to Ev1 AllVal. Subgoal 17: Variables: G V V1 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (tail E1) V @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 (cons V1 V) * V : value (cons V1 V) ============================ value V
< case V. Subgoal 17: Variables: G V V1 E1 IH : forall G E V, eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V Ev : eval_e G (tail E1) V @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E1 (cons V1 V) * H1 : value V1 H2 : value V ============================ value V
< search. Proof completed.
< Prove library:host:eval_s_value. Subgoal 9: Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ AllVal : forall X XV, mem (X, XV) G -> value XV Mem : mem (Y, YV) ((Hd, V1)::((Tl, V2)::GTl)) Ev1 : eval_e G E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd G Ev4 : select (Tl, VTl) GTl GHd ============================ value YV
< VCons: apply eval_e_value to Ev1 AllVal. Subgoal 9: Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ AllVal : forall X XV, mem (X, XV) G -> value XV Mem : mem (Y, YV) ((Hd, V1)::((Tl, V2)::GTl)) Ev1 : eval_e G E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd G Ev4 : select (Tl, VTl) GTl GHd VCons : value (cons V1 V2) ============================ value YV
< V: case VCons (keep). Subgoal 9: Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ AllVal : forall X XV, mem (X, XV) G -> value XV Mem : mem (Y, YV) ((Hd, V1)::((Tl, V2)::GTl)) Ev1 : eval_e G E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd G Ev4 : select (Tl, VTl) GTl GHd VCons : value (cons V1 V2) V : value V1 V1 : value V2 ============================ value YV
< M: case Mem. Subgoal 9.1: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd G Ev4 : select (Tl, VTl) GTl GHd VCons : value (cons V1 V2) V : value V1 V1 : value V2 ============================ value V1
< search. Subgoal 9.2: Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd G Ev4 : select (Tl, VTl) GTl GHd VCons : value (cons V1 V2) V : value V1 V1 : value V2 M : mem (Y, YV) ((Tl, V2)::GTl) ============================ value YV
< M: case M. Subgoal 9.2.1: Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd G Ev4 : select (Tl, VTl) GTl GHd VCons : value (cons V1 V2) V : value V1 V1 : value V2 ============================ value V2
< search. Subgoal 9.2.2: Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd G Ev4 : select (Tl, VTl) GTl GHd VCons : value (cons V1 V2) V : value V1 V1 : value V2 M : mem (Y, YV) GTl ============================ value YV
< MGHd: apply mem_after_select_before to _ M. Subgoal 9.2.2: Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd G Ev4 : select (Tl, VTl) GTl GHd VCons : value (cons V1 V2) V : value V1 V1 : value V2 M : mem (Y, YV) GTl MGHd : mem (Y, YV) GHd ============================ value YV
< apply mem_after_select_before to _ MGHd. Subgoal 9.2.2: Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E IH : forall G S G' Y YV, eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' -> value YV Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @ AllVal : forall X XV, mem (X, XV) G -> value XV Ev1 : eval_e G E (cons V1 V2) Ev2 : Hd = Tl -> false Ev3 : select (Hd, VHd) GHd G Ev4 : select (Tl, VTl) GTl GHd VCons : value (cons V1 V2) V : value V1 V1 : value V2 M : mem (Y, YV) GTl MGHd : mem (Y, YV) GHd H1 : mem (Y, YV) G ============================ value YV
< backchain AllVal. Proof completed.
< Prove library:host:vars_eval_same_result. Subgoal 12: Variables: G1 G2 D V2 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 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars nil D Ev1 : eval_e G1 nil nil @ Ev2 : eval_e G2 nil V2 ============================ nil = V2
< case Ev2. Subgoal 12: Variables: G1 G2 D 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 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Vars : vars nil D Ev1 : eval_e G1 nil nil @ ============================ nil = nil
< search. Subgoal 13: 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 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) (cons V3 V4) @ Ev2 : eval_e G2 (cons E1 E2) V2 Ev3 : eval_e G1 E1 V3 * Ev4 : eval_e G1 E2 V4 * ============================ cons V3 V4 = V2
< Ev2: case Ev2. Subgoal 13: 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 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) (cons 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 ============================ cons V3 V4 = cons V5 V6
< Vars: case Vars. Subgoal 13: Variables: G1 G2 D V4 V3 E2 E1 V6 V5 Vr1 Vr2 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 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) (cons 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 Vars : vars E1 Vr1 Vars1 : vars E2 Vr2 Vars2 : Vr1 ++ Vr2 = D ============================ cons V3 V4 = cons V5 V6
< apply IH to _ Vars Ev3 Ev2. Subgoal 13.1: Variables: G1 G2 D V4 V3 E2 E1 V6 V5 Vr1 Vr2 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 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) (cons 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 Vars : vars E1 Vr1 Vars1 : vars E2 Vr2 Vars2 : Vr1 ++ Vr2 = D ============================ forall X U1 U2, mem X Vr1 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left. Subgoal 13: Variables: G1 G2 D V4 E2 E1 V6 V5 Vr1 Vr2 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 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) (cons 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 Vars : vars E1 Vr1 Vars1 : vars E2 Vr2 Vars2 : Vr1 ++ Vr2 = D ============================ cons V5 V4 = cons V5 V6
< apply IH to _ Vars1 Ev4 Ev5. Subgoal 13.2: Variables: G1 G2 D V4 E2 E1 V6 V5 Vr1 Vr2 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 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) (cons 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 Vars : vars E1 Vr1 Vars1 : vars E2 Vr2 Vars2 : Vr1 ++ Vr2 = D ============================ forall X U1 U2, mem X Vr2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right. Subgoal 13: Variables: G1 G2 D E2 E1 V6 V5 Vr1 Vr2 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 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) (cons 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 Vars : vars E1 Vr1 Vars1 : vars E2 Vr2 Vars2 : Vr1 ++ Vr2 = D ============================ cons V5 V6 = cons V5 V6
< search. Subgoal 14: 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 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) trueE @ Ev2 : eval_e G2 (null E1) V2 Ev3 : eval_e G1 E1 nil * ============================ trueE = V2
< Ev2: case Ev2. Subgoal 14.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 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) trueE @ Ev3 : eval_e G1 E1 nil * Ev2 : eval_e G2 E1 nil ============================ trueE = trueE
< search. Subgoal 14.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 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) trueE @ Ev3 : eval_e G1 E1 nil * Ev2 : eval_e G2 E1 (cons V3 V4) ============================ trueE = falseE
< Vars: case Vars. Subgoal 14.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 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (null E1) trueE @ Ev3 : eval_e G1 E1 nil * Ev2 : eval_e G2 E1 (cons V3 V4) Vars : vars E1 D ============================ trueE = falseE
< apply IH to _ Vars Ev3 Ev2. Subgoal 15: 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 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) falseE @ Ev2 : eval_e G2 (null E1) V2 Ev3 : eval_e G1 E1 (cons V3 V4) * ============================ falseE = V2
< Ev2: case Ev2. Subgoal 15.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 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) falseE @ Ev3 : eval_e G1 E1 (cons V3 V4) * Ev2 : eval_e G2 E1 nil ============================ falseE = trueE
< Vars: case Vars. Subgoal 15.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 Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2 Ev1 : eval_e G1 (null E1) falseE @ Ev3 : eval_e G1 E1 (cons V3 V4) * Ev2 : eval_e G2 E1 nil Vars : vars E1 D ============================ falseE = trueE
< apply IH to _ Vars Ev3 Ev2. Subgoal 15.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 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) falseE @ Ev3 : eval_e G1 E1 (cons V3 V4) * Ev2 : eval_e G2 E1 (cons V5 V6) ============================ falseE = falseE
< search. Subgoal 16: 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 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 (cons V1 V3) * ============================ V1 = V2
< Ev2: case Ev2. Subgoal 16: 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 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 (cons V1 V3) * Ev2 : eval_e G2 E1 (cons V2 V4) ============================ V1 = V2
< Vars: case Vars. Subgoal 16: 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 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 (cons V1 V3) * Ev2 : eval_e G2 E1 (cons V2 V4) Vars : vars E1 D ============================ V1 = V2
< apply IH to _ _ Ev3 Ev2. Subgoal 16: 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 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 (cons V2 V4) * Ev2 : eval_e G2 E1 (cons V2 V4) Vars : vars E1 D ============================ V2 = V2
< search. Subgoal 17: 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 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 (cons V3 V1) * ============================ V1 = V2
< Ev2: case Ev2. Subgoal 17: 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 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 (cons V3 V1) * Ev2 : eval_e G2 E1 (cons V4 V2) ============================ V1 = V2
< Vars: case Vars. Subgoal 17: 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 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 (cons V3 V1) * Ev2 : eval_e G2 E1 (cons V4 V2) Vars : vars E1 D ============================ V1 = V2
< apply IH to _ _ Ev3 Ev2. Subgoal 17: 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 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 (cons V4 V2) * Ev2 : eval_e G2 E1 (cons V4 V2) Vars : vars E1 D ============================ V2 = V2
< search. Proof completed.